首页 > 其他分享 >2.2 vp Codeforces Round #848 (Div. 2)

2.2 vp Codeforces Round #848 (Div. 2)

时间:2023-02-02 21:00:28浏览次数:39  
标签:满足条件 cnt int sum Codeforces 848 vp ++ ans

A - Flip Flop Sum

题意

给出长度为n的序列a,a中只包括1和-1,你必须操作一次,让相邻两个元素由1变-1或由-1变1,问操作后数组总和最大多少

思路

暴力即可

void solve() {
	int n;
	cin >> n;
	vector<int> a(n + 1);
	int sum = 0;
	for (int i = 1; i <= n; i ++) cin >>a[i], sum += a[i];
	int ans = sum;
	sum = -INF;
	for (int i = 1; i < n; i ++) {
		int x = ans;
		if (a[i] == 1) x -= 2;
		else x += 2;
		if (a[i + 1] == 1) x -= 2;
		else x += 2;
		sum = max(x, sum);
	}
	
	cout <<sum <<endl;
}

\[\]

B - The Forbidden Permutation

题意

给出长度为n的排列,还有m个排列中的数字组成的序列a,和d
若m个数字都满足条件
则是不好的
问最少操作多少次可以使a好

思路

本题切记要看清楚题,是全满足条件才不好,只要有一个不满足条件即好。我看成了必须都要满足条件才好,到打完了都不知道为什么不对。
读清楚题目后就很简单了,只有两种方法,一是将\(a_{i + 1}\)放到\(a_i\)前面,二是将\(a_{i + 1}\)放到\(a_i\)距离为d的后面,对每个相邻对儿找一遍最小操作数即可

void solve() {
	int n, m, d;
	cin >> n >> m >> d;
	vector<int> a(n + 1), p(n + 1), b(m + 1);
	for (int i = 1; i <= n; i ++) {
		cin >> a[i];
		p[a[i]] = i;
	}
	
	for (int i = 1; i <= m; i ++) {
		cin >> b[i];
	}
	
	int ans = INF;
	for (int i = 1; i < m; i ++) {
		if (p[b[i + 1]] < p[b[i]] || p[b[i]] + d < p[b[i + 1]]) {     //若不满足条件,直接好,输出0
			ans = 0;
			break;
		}
		
		int x, y;
		x = p[b[i + 1]] - p[b[i]];                                   //放到前面
		if (d + 2 <= n) {                                            //放到后面
			y = d + 2 - (p[b[i + 1]] - p[b[i]] + 1);
		}else y = INF;
		ans = min(ans, min(x, y));
	}
	
	cout << ans << endl;
}

\[\]

C - Flexible String

题意

给出字符串a, b。a只能更换k种字符,问a更换完字符后,和b最多有多少个区间是相同的

思路

暴力枚举即可,使用二进制枚举法,将a中出现过的字符数记录下来,然后枚举它是否出现,当选中了k种就去和b对照,求出区间数,然后求最大值即可

void solve() {
	int n, k;
	cin >> n >> k;
	string a, b;
	cin >> a >> b;
	vector<int> ap(30, 0), bn(30, 0);
	int cnt = 0;
	for (int i = 0; i < n; i ++) {
		if (!ap[a[i] - 'a']) ap[a[i] - 'a'] = 1;
	}
	
	for (int i = 0; i < 26; i ++) {
		if (ap[i]) bn[cnt ++] = i;
	}
	
	int cs = min(cnt, k);
	
	int q = pow(2, cnt) - 1;
	LL ans = 0;
	for (int i = 0; i <= q; i ++) {
		vector<int> use(30, 0);
		int num = 0, tmp = i, tt = 0;
		while (tmp) {
			if (tmp & 1) {
				use[bn[tt]] = 1;
				num ++;
			}
			tmp >>= 1;
			tt ++;
		}
		
		if (cs == num) {
			string t = a;
			for (int j = 0; j < n; j ++) {
				if (use[t[j] - 'a']) {
					t[j] = b[j];
				}
			}
			
			LL sum = 0, cnt = 0;
			
			for (int j = 0; j < n; j ++) {
				if (t[j] == b[j]) cnt ++;
				else {
					sum += cnt * (cnt + 1) / 2;
					cnt = 0;
				}
				if (j == n - 1) sum += cnt * (cnt + 1) / 2;
			}
			
			ans = max(ans, sum);
		}
	}
	
	cout << ans << endl;
}

总结

读错题害死人。二进制枚举法确实不错,学到了

标签:满足条件,cnt,int,sum,Codeforces,848,vp,++,ans
From: https://www.cnblogs.com/lbzbk/p/17087402.html

相关文章

  • Codeforces Round #848 (Div. 2)
    题目链接A核心思路按照题目模拟就好了//Problem:A.FlipFlopSum//Contest:Codeforces-CodeforcesRound#848(Div.2)//URL:https://codeforces.com/cont......
  • Codeforces Round #831 (Div. 1 + Div. 2) A-H
    CodeforcesRound#831(Div.1+Div.2)A-H题解好久之前写的,发现忘记发了比赛题目质量高,推荐!传送门CodeforcesRound#831(Div.1+Div.2)A.FactoriseN+M题......
  • Codeforces Round #848 (Div. 2) A~C
    A.给出一个-1,1序列,操作是交换相邻位置的符号,一定要操作一次,求最大sum。只有4种情况,扫一遍判断是否出现即可。B题面写得真清楚啊:)#include<bits/stdc++.h>usingnam......
  • Codeforces Round #848 (Div. 2) A~F 题解
    A.FlipFlopSum能换\(-1,-1\)就换,不能能换\(1,-1\)或\(-1,1\)也可以,否则只能换\(1,1\)。B.TheForbiddenPermutation如果原序列一开始就是好的那就结束,否则......
  • Codeforces1778E 【线性基】【换根DP】
    我,差30秒,就能AC这道题,我知道错哪的时候是倒计时30,不记得优先级想赌一把,因为我没有先写括号的习惯,所以倒计时14的时候交了,然后想改了括号再交一发,改了括号之后,比赛结束了。......
  • Educational Codeforces Round 135 (Rated for Div. 2) F. Fishermen 二分图最小带权
    不用真的建图,真的建图两人之间的代价不好算。等价转化为对给定的ai找出bi,使得bi=k*a[i],且互不相同k的上界为n,简易证明:[若a[i]互不相等,全部选a[i]*n会比a[i]*(n+1)更好;......
  • 2.1 vp Codeforces Round #842 (Div. 2)
    A-GreatestConvex题意给出k,要找出最大的x(1<=x<=k),使x!+(x-1)!是k的倍数,问是否存在,为多少思路变换一下即可得原式为(x-1)!(x+1),若要满足条件,令x=k-......
  • Educational Codeforces Round 134 (Rated for Div. 2) F - Matching Reduction 最小
    真傻逼Σ(☉▽☉"a——wa23是因为数组开小了,wa53是数组开大了爆了(不能任性随便开了问最少删多少点使得最大匹配数-1这题就考一个结论:最大匹配数==最小点覆盖 所以很......
  • Codeforces Round #843 (Div. 2)
    感觉难度递减?B.GardenerandtheArray题意:给出一个序列,问其是否存在两个不同的子序列,其或运算之和相同。解:题目很友好,直接给出一个数二进制下哪些位为1.如果一个数为......
  • CodeForces 607B Zuma
    CF607BZumalink洛谷linkCodeForces题意Genos最近在他的手机上下载了祖玛游戏。在祖玛游戏里,存在\(n\)个一行的宝石,第\(i\)个宝石的颜色是\(C_i\)。这个游戏......