好久没刷codeforces了,真菜
A 水题
#include<bits/stdc++.h> #define rep(i, n) for(int i=0;i!=n;++i) #define per(i, n) for(int i=n-1;i>=0;--i) #define Rep(i, sta, n) for(int i=sta;i!=n;++i) #define rep1(i, n) for(int i=1;i<=n;++i) #define per1(i, n) for(int i=n;i>=1;--i) #define Rep1(i, sta, n) for(int i=sta;i<=n;++i) #define L rt<<1 #define R rt<<1|1 #define inf (0x3f3f3f3f) #define llinf (1e18) #define ALL(A) A.begin(),A.end() #define SIZE(A) ((int)A.size()) #define MOD (1e9 + 7) #define PII pair<int,int> typedef long long i64; using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t; cin >> t; i64 a,b; while(t--){ cin >> a >> b; i64 dif = abs(a - b),ans = 0; if(dif % 10) ans = 1; ans += dif / 10; cout << ans << endl; } return 0; }
B 注意下 :俩个数和相同的情况下,差值越大乘积越小,因此贪心比较就好了
#include<bits/stdc++.h> #define rep(i, n) for(int i=0;i!=n;++i) #define per(i, n) for(int i=n-1;i>=0;--i) #define Rep(i, sta, n) for(int i=sta;i!=n;++i) #define rep1(i, n) for(int i=1;i<=n;++i) #define per1(i, n) for(int i=n;i>=1;--i) #define Rep1(i, sta, n) for(int i=sta;i<=n;++i) #define L rt<<1 #define R rt<<1|1 #define inf (0x3f3f3f3f) #define llinf (1e18) #define ALL(A) A.begin(),A.end() #define SIZE(A) ((int)A.size()) #define MOD (1e9 + 7) #define PII pair<int,int> typedef long long i64; using namespace std; i64 s(i64 a, i64 b, i64 x, i64 y, i64 n) { i64 t=min(a-x, n); a-=t; n-=t; t=min(b-y, n); b-=t; return a*b; } void solve() { i64 a, b, x, y, n; cin >> a >> b >> x >> y >> n; cout << (min(s(a, b, x, y, n), s(b, a, y, x, n))) << endl; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t; cin >> t; while(t--){ solve(); } return 0; }
C 贪心
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> #define rep(i, n) for(int i=0;i!=n;++i) #define per(i, n) for(int i=n-1;i>=0;--i) #define Rep(i, sta, n) for(int i=sta;i!=n;++i) #define rep1(i, n) for(int i=1;i<=n;++i) #define per1(i, n) for(int i=n;i>=1;--i) #define Rep1(i, sta, n) for(int i=sta;i<=n;++i) #define L rt<<1 #define R rt<<1|1 #define inf (0x3f3f3f3f) #define llinf (1e18) #define ALL(A) A.begin(),A.end() #define SIZE(A) ((int)A.size()) #define MOD (1e9 + 7) #define PII pair<int,int> typedef long long i64; using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t,n,x,y; cin >> t; while(t--){ cin >> n >> x >> y;//n - 1间隔 vector<int> vec; int dif = y - x,dic,step; for(dic = n-1;;--dic)//划分 n - 1,不满足 if(dif % dic == 0){ step = dif / dic; break; } for(int i=x;i<=y;i+=step) vec.push_back(i); for(int i=x-step;i>0;i-=step){ if(vec.size() == n) break; vec.push_back(i); } for(int i=y+step;;i+=step){ if(vec.size() == n) break; vec.push_back(i); } for(auto &val:vec) cout << val << " "; cout << endl; } return 0; }
D 模拟题
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> #define rep(i, n) for(int i=0;i!=n;++i) #define per(i, n) for(int i=n-1;i>=0;--i) #define Rep(i, sta, n) for(int i=sta;i!=n;++i) #define rep1(i, n) for(int i=1;i<=n;++i) #define per1(i, n) for(int i=n;i>=1;--i) #define Rep1(i, sta, n) for(int i=sta;i<=n;++i) #define L rt<<1 #define R rt<<1|1 #define inf (0x3f3f3f3f) #define llinf (1e18) #define ALL(A) A.begin(),A.end() #define SIZE(A) ((int)A.size()) #define MOD (1e9 + 7) #define PII pair<int,int> typedef long long i64; using namespace std; i64 to_10(int n){ i64 num = 1; rep(i,n) num *= 10; return num; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t,s,cnt,pos; cin >> t;//cnt 代表之前的数字和 string str; while(t--){ cin >> str >> s; i64 ans = 0; cnt = 0, pos = 0; rep(i,SIZE(str)){ if(cnt + (str[i] - '0') <= s){ ++pos; cnt += (str[i] - '0'); }else break; } if(pos == SIZE(str)){ cout << 0 << endl; continue; } int len = str.substr(pos).size(); i64 num = atoll(str.substr(pos).c_str()); ans += to_10(len) - num; if(cnt == s){ Rep(i, pos, SIZE(str)) str[i] = '0'; if(str[pos-1] != '9'){ int index = pos - 1 -1; per(i,pos) if(str[i] == '0') --index; else break; ++str[pos-1];//进位加上 if(index == -1) ans += to_10(SIZE(str)) - atoll(str.c_str()); else ans += to_10(SIZE(str) - index - 1) - atoll(str.substr(index+1).c_str()); } } cout << ans << endl; } return 0; }
E :点的坐标与y坐标无关,因此可以将所有的x点的坐标排序,枚举二分可以找到从每个小球开始的可以包含小球个数,但是第二块木板可以从后面的任何位置开始,因此需要存储后面的最大值
#include<bits/stdc++.h> #define rep(i, n) for(int i=0;i!=n;++i) #define per(i, n) for(int i=n-1;i>=0;--i) #define Rep(i, sta, n) for(int i=sta;i!=n;++i) #define rep1(i, n) for(int i=1;i<=n;++i) #define per1(i, n) for(int i=n;i>=1;--i) #define Rep1(i, sta, n) for(int i=sta;i<=n;++i) #define L rt<<1 #define R rt<<1|1 #define inf (0x3f3f3f3f) #define llinf (1e18) #define ALL(A) A.begin(),A.end() #define SIZE(A) ((int)A.size()) #define MOD (1e9 + 7) #define PII pair<int,int> typedef long long i64; using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t,n,k; cin >> t; while(t--){ cin >> n >> k; vector<int> x(n),y(n),dp(n+1,0); for(auto &val:x) cin >> val; for(auto &val:y) cin >> val; sort(x.begin(),x.end()); per(i, n){ int nowx = x[i] +k; int index = upper_bound(x.begin(),x.end(),nowx) - x.begin(); dp[i] = max(dp[i+1], index - i); } int ans = 0; rep(i, n){ int nowx = x[i] + k; int index = upper_bound(x.begin(),x.end(),nowx) - x.begin(); ans = max(ans, index - i + dp[index]); } cout << ans << endl; } return 0; }
F: 统计个数,由题可知 个数为 每个t[1]字符的t[0]字符的和,可以改变任意字符,因此考虐从头到尾进行dp,因为只有前面状态确定了才可以进行统计
一共存在三种状态
s[i] 不发生变化
当 发生变化的次数小于k:
s[i] -> t[0]
s[i] -> t[1]
具体见代码
#include<bits/stdc++.h> #define rep(i, n) for(int i=0;i!=n;++i) #define per(i, n) for(int i=n-1;i>=0;--i) #define Rep(i, sta, n) for(int i=sta;i!=n;++i) #define rep1(i, n) for(int i=1;i<=n;++i) #define per1(i, n) for(int i=n;i>=1;--i) #define Rep1(i, sta, n) for(int i=sta;i<=n;++i) #define L rt<<1 #define R rt<<1|1 #define inf (0x3f3f3f3f) #define llinf (1e18) #define ALL(A) A.begin(),A.end() #define SIZE(A) ((int)A.size()) #define MOD (1e9 + 7) #define PII pair<int,int> typedef long long i64; using namespace std; const int maxn = 256; int dp[maxn][maxn][maxn]; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int n,k; string s,t; while(cin >> n >> k >> s >> t){ memset(dp,-1,sizeof(dp)); dp[0][0][0] = 0; for(int i=0;i!=n;++i){ for(int j=0;j<=k;++j){ for(int cnt0 = 0;cnt0 <= n;++cnt0){ if(dp[i][j][cnt0] == -1) continue; bool e0 = s[i] == t[0]; bool e1 = s[i] == t[1]; bool e01 = t[0] == t[1]; dp[i+1][j][cnt0 + e0] = max(dp[i+1][j][cnt0 + e0], dp[i][j][cnt0] + (e1? cnt0 : 0));//不变 if(j < k){ dp[i+1][j+1][cnt0 + 1] = max(dp[i+1][j+1][cnt0 +1], dp[i][j][cnt0] + (e01? cnt0 : 0));//变为t0 dp[i+1][j+1][cnt0 + e01] = max(dp[i+1][j+1][cnt0 + e01] , dp[i][j][cnt0] + cnt0);//变为t1 } } } } int ans = 0; for(int i=0;i<=k;++i) for(int j =0;j<=n;++j) ans = max(ans, dp[n][i][j]); cout << ans << endl; } return 0; }