AtCoder Beginner Contest 095 解题报告

xiaoxiao2021-02-28  8

A,B,C都是水题,思路如下: A:看有多少o,在700的基础上加上就是。 代码:

#include <iostream> #include <cstdio> #include <cmath> #include <cstring> int main(){ char s[4]; scanf("%s",&s); int len = strlen(s); int ans = 0; for(int i = 0; i < len; i++){ if(s[i] == 'o') ans++; } printf("%d\n",ans*100 + 700); return 0; }

B:先把基础的减去,再除最小那个即可。 代码:

#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; int n,x; int m[105]; int minn = 10005; int cnt = 0; int main(){ scanf("%d %d",&n, &x); for(int i = 0; i < n; i++){ scanf("%d",&m[i]); x -= m[i]; cnt++; if(m[i] < minn){ minn = m[i]; } } printf("%d\n",cnt + x / minn); return 0; }

C:只有三种情况。 1.分开买 2.先用A-B混合型买,再把剩下的单独买 3.全部用A-B混合型买 求最小值即可。 代码:

#include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; int minn(int a, int b){ if(a < b) return a; return b; } int maxx(int a, int b){ if(a > b) return a; return b; } int main(){ int a, b, c, x, y; long long ans = 0; scanf("%d %d %d %d %d",&a, &b, &c, &x, &y); int maxy = maxx(x, y); int miny = minn(x, y); int chaxy = maxy - miny; if(2 * c < a + b){ ans += miny * 2 * c; if(miny == x) ans += chaxy * b; else ans += chaxy * a; } else{ ans = x * a + y * b; } long long sum = 2 * c * maxy; if(sum < ans) printf("%lld\n",sum); else printf("%lld\n",ans); return 0; }

D:有四种情况: 1.正着走 2.逆着走 3.在正着走中途倒回去 4.在逆着走中途倒回去。 用dp[0][i]表示正着走到第i个点所得的最大能量,dp[1][i] 表示逆着走到第i个点的最大能量。m[0][i] 表示正着在第i个点倒回去的能量,m[1][i] 反之。 代码:

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int maxn = 1e5 + 5; const long long inf = 1e14 + 5; int n,v[maxn]; long long c, ans,x[maxn]; long long dp[2][maxn], m[2][maxn]; int main(){ scanf("%d %lld",&n, &c); for(int i = 0; i < n; i++){ scanf("%lld %d",&x[i],&v[i]); } for(int i = 0; i < n; i++) dp[0][i] = dp[1][i] = -inf;//初始化 long long sum = 0; for(int i = 0; i < n; i++){ sum += v[i]; dp[0][i] = max(dp[0][i - 1], sum - x[i]);//走或不走这个点 m[0][i] = sum - 2 * x[i];//走回去自然是两倍 } sum = 0;//置为0 for(int i = n - 1; i >= 0; i--){//反着来 sum += v[i]; dp[1][i] = max(dp[1][i + 1], sum - (c - x[i])); m[1][i] = sum - 2 * (c - x[i]); } ans = max(dp[0][n-1], dp[1][0]);//正着走到n-1和反着走到0的最大值 for(int i = 0; i < n; i++){ ans = max(ans, m[0][i] + dp[1][i + 1]);//反着走中途倒回去 ans = max(ans, m[1][n - i] + dp[0][n - i - 1]);//正着走中途倒回去 } if(ans != 0) printf("%lld\n",ans); else printf("0\n"); return 0; }
转载请注明原文地址: https://www.6miu.com/read-1900255.html

最新回复(0)