Codeforces Round #667 (Div. 3) 题解
好久没刷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 贪心
#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 模拟题
#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;
}
不怕万人阻挡,只怕自己投降。
posted on 2020-09-13 00:40 chengyulala 阅读(174) 评论(0) 收藏 举报
浙公网安备 33010602011771号