Educational Codeforces Round 160 (Rated for Div. 2)(A-D)
Educational Codeforces Round 160 (Rated for Div. 2)(A-D)
A Rating Increase
分析
尽量使前一个小,后一个大。模拟即可。
点击查看代码
const int N = 1010;
string s;
void solve () {
cin >> s;
int n = s.size();
int a = 0, b = 0;
bool ok = false;
for (int i = 0; i < n; i ++) {
if (!ok) {
if (s[i] != '0' && i != 0) {
ok = true;
b = b * 10 + s[i] - '0';
} else {
a = a * 10 + s[i] - '0';
}
} else {
b = b * 10 + s[i] - '0';
}
}
if (a >= b) {
cout << -1 << endl;
return ;
}
cout << a << ' ' << b << endl;
return ;
}
B Swap and Delete
分析
统计0和1的数量,然后遍历字符串,贪心策略为:如果对应位置的相反字符有剩余则放相反字符,否则放相同字符。
放完之后双指针统计一下要删多少即可。
点击查看代码
void solve () {
string s; cin >> s;
int n = s.size();
s = " " + s;
map<char, int> mp;
for (int i = 1; i <= n; i ++) {
mp[s[i]] ++;
}
string res = "";
for (int i = 1; i <= n; i ++) {
if (mp['1' - s[i] + '0']) {
res += '1' - s[i] + '0';
mp['1' - s[i] + '0'] --;
} else {
res += s[i];
mp[s[i]] --;
}
}
int m = res.size();
res = " " + res;
int ans = 0;
for (int i = 1, j = 1; i <= n && j <= m;) {
if (s[i] == res[j]) {
j ++;
ans ++;
} else {
i ++;
j ++;
}
}
cout << ans << endl;
return ;
}
C Game with Multiset
分析
很明显是二进制题,使用cn数组存下来二进制下的每一位有多少个,在get询问时,我们从高向低凑,如果凑不出来就是NO。模拟即可。
点击查看代码
void solve () {
int q; cin >> q;
vector<ll> cn(31), cp(31);
while (q --) {
int op, x; cin >> op >> x;
if (op == 1) {
cn[x] ++;
}
else {
cp = cn;
bool ok = true;
for (int i = 31; i >= 0; i --) {
if ((x >> i) & 1) {
ll vali = 1ll << i;
for (int j = min(29, i); j >= 0; j --) {
ll valj = 1ll << j;
if (vali == 0) break;
if (valj * cn[j] < vali) {
vali -= valj * cn[j];
cn[j] = 0;
} else {
cn[j] -= vali / valj;
vali = 0;
break;
}
}
if (vali != 0) {
ok = false;
break;
}
}
}
if (!ok) cout << "NO" << endl;
else cout << "YES" << endl;
cn = cp;
}
}
return ;
}
D
分析
点击查看代码

浙公网安备 33010602011771号