Codeforces Round 916 (Div. 3)(A-E2)
Codeforces Round 916 (Div. 3)(A-E2)
A
分析
统计一下每个字符出现的次数即可
代码
点击查看代码
void solve () {
	int n; cin >> n;
    string s; cin >> s;
    map<int, int> mp;
    for (int i = 0; i < n; i ++) {
    	mp[s[i] - 'A' + 1] ++;
    }
    int ans = 0;
    for (int i = 1; i <= 26; i ++) {
    	if (mp[i] >= i) ans ++;
    }
    cout << ans << endl;
    return ;
}
B Preparing for the Contest
分析
将排列翻转一部分即可
代码
点击查看代码
void solve () {
    int n, k; cin >> n >> k;
    vector<int> a(n + 1);
    for (int i = 1; i <= n - k; i ++) a[i] = n - k - i + 1;
    for (int i = n - k + 1; i <= n; i ++) a[i] = i;
    for (int i = 1; i <= n; i ++) cout << a[i] << ' ';
    cout << endl; 
    return ;
}
C Quests
分析
枚举只使用前i个,因此要做i次初始价值的任务,同时维护前缀最大值,将剩余次数全部给它,O(n)求出答案
代码
点击查看代码
void solve () {
    int n, k; cin >> n >> k;
    vector<ll> a(n + 1), b(n + 1);
    for (int i = 1; i <= n; i ++) cin >> a[i];
    for (int i = 1; i <= n; i ++) cin >> b[i];
    ll ans = -INF, pre = 0, mx = -INF;
    for (int i = 1; i <= min(n, k); i ++) {
    	pre += a[i];
    	mx = max(mx, b[i]);
    	ans = max(ans, pre + (k - i) * mx);
    }
    cout << ans << endl;
    return ;
}
D Three Activities
分析
维护前后缀最大值,枚举每天进行哪个活动,维护最大值即可
代码
点击查看代码
void solve () {
    int n; cin >> n;
    vector<int> a(n + 1), b(n + 1), c(n + 1);
    vector<int> p1(n + 2, 0), p2(n + 2, 0), p3(n + 2, 0);
    vector<int> s1(n + 2, 0), s2(n + 2, 0), s3(n + 2, 0);
    for (int i = 1; i <= n; i ++) {
    	cin >> a[i];
    	p1[i] = max(a[i], p1[i - 1]);
    }
    for (int i = 1; i <= n; i ++) {
    	cin >> b[i];
    	p2[i] = max(b[i], p2[i - 1]);
    }
    for (int i = 1; i <= n; i ++) {
    	cin >> c[i];	
    	p3[i] = max(c[i], p3[i - 1]);
    }
    for (int i = n; i >= 1; i --) {
    	s1[i] = max(a[i], s1[i + 1]);
    	s2[i] = max(b[i], s2[i + 1]);
    	s3[i] = max(c[i], s3[i + 1]);
    }
    int ans = 0;
    for (int i = 1; i <= n; i ++) 
    	ans = max(
    			{ans, 
    			a[i] + p2[i - 1] + s3[i + 1], a[i] + p3[i - 1] + s2[i + 1],
    			b[i] + p1[i - 1] + s3[i + 1], b[i] + p3[i - 1] + s1[i + 1],
    			c[i] + p1[i - 1] + s2[i + 1], c[i] + p2[i - 1] + s1[i + 1]
    			});
	cout << ans << endl;
    return ;
}
E1&&E2 Game with Marbles
分析
对\(a_i + b_i\)进行排序即可
如果此时Alice操作,那么收益为\(a_i - 1 + b_i\),如果是Bob操作,收益为\(b_i - 1 + a_i\),可以发现对于二者而言,判断选项的优劣的标准是一致的,因此按\(a_i + b_i\)排序即可
代码
点击查看代码
void solve () {
    int n; cin >> n;
	vector<int> a(n + 1, 0), b(n + 1, 0);
	vector<PII> d(n + 1, {0, 0});
	for (int i = 1; i <= n; i ++) cin >> a[i];
	for (int i = 1; i <= n; i ++) cin >> b[i];
	for (int i = 1; i <= n; i ++) d[i].fi = a[i] + b[i], d[i].sc = i;
	sort(d.begin() + 1, d.end(), greater<PII>());
	ll ans = 0;
	for (int i = 1; i <= n; i ++) {
		if (i & 1) {
			ans += a[d[i].sc] - 1;
		} else {
			ans -= b[d[i].sc] - 1;
		}
	}
	cout << ans << endl;
    return ;
}

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号