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

分析

点击查看代码

posted @ 2023-12-22 08:22  ComistryMo  阅读(28)  评论(0)    收藏  举报