Codeforces Round #767 (Div. 2) A ~ D

Posted Ja_King_ZH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #767 (Div. 2) A ~ D相关的知识,希望对你有一定的参考价值。

A.https://codeforces.com/contest/1629/problem/A

题意:给定n和k,以及两个数组a,b(大小为n),若k大于等于ai,则可以获得bi,问能获得的最大价值是多少。
题解,贪心,先找最小的,若大于此时最小的ai,则加上bi,在找次小的。

typedef pair<int, int>PII;
const int N = 110;
int a[N], b[N];
PII c[N];
int main()

	int t;
	cin >> t;
	while (t--)
	
		int n, k;
		cin >> n >> k;
		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++)
		
			c[i] =  a[i], b[i] ;
		
		sort(c + 1, c + 1 + n);
		for (int i = 1; i <= n; i++)
		
			if (k >= c[i].first) k += c[i].second;
		
		cout << k << endl;
	
	return 0;

B.https://codeforces.com/contest/1629/problem/B

题意:给定 l 和 r ,数组为l到r直接的每一个数,如l = 1,r = 3,则数组为1 2 3,问在k次操作下,能否使得数组的最大公因数大于1。
题解:结论题,当(r - l + 1) / 2 <= k时,yes,否则no,但当l为奇数时,应为(r - l + 2) / 2,并需要特判l = r 时。

int main()

	int t;
	cin >> t;
	while (t--)
	
		int l, r, k, res = 0;
		cin >> l >> r >> k;
		res = r - l + 1;
		if (l == r && l != 1)
		
			puts("YES");
			continue;
		
		if (l % 2 == 1) res++;
		if (res / 2 <= k) puts("YES");
		else puts("NO");
	
	return 0;

C.https://codeforces.com/contest/1629/problem/C

题意:定义mex为当前选定的前k个数字中最小非负整数,并将当前mex加入新数组中,删除前k个数据,直到数组为空。要求新数组字典序最大。
题解:首先找到第一个断层的数,即数组中,第一个数组没有的非负整数,然后在遍历数组,找到最小满足条件的k,并更新mex。

const int N = 2e5 + 10;
int a[N], f[N];

int main()

	int t;
	cin >> t;
	while (t--)
	
		int n;
		cin >> n;
		for (int i = 1; i <= n; i++)
		
			cin >> a[i];
			f[a[i]]++;
		
		vector<int>ans;
		set<int>s;
		int mex = 0;
		for (int i = 0; i <= n;i++)
		
			if (f[i]) s.insert(i);
			else
			
				mex = i;
				if(i) ans.push_back(i);
				break;
			
		
		for (int i = 1; i <= n; i++)
		
			if (s.size() == 0)
			
				ans.push_back(mex);
				for (int i = 0; i < mex;i++)s.insert(i);
			
			f[a[i]]--;
			if (s.find(a[i]) != s.end()) s.erase(a[i]);
			if (f[a[i]] == 0) mex = min(mex, a[i]);
		
		cout << ans.size() << endl;
		for (int i = 0; i < ans.size();i++)cout << ans[i] << ' ';
		cout << endl;
	
	return 0;

D.https://codeforces.com/contest/1629/problem/D

题意:给定n个字符串长度小于等于3的字符串。选定部分字符串,判断能否组成回文字符串。
题解:map进行哈希即可(注意情况考虑完全!!!!!!)。

int main()

	int t;
	cin >> t;
	map<string, int>mp;
	while (t--)
	
		int n;
		cin >> n;
		int f = 0;
		for (int i = 0; i < n; i++)
		
			string res;
			cin >> res;
			mp[res]++;
			if (res.size() == 1) f = 1;
			reverse(res.begin(), res.end());
			if (res.size() % 2 == 1)
			
				if (mp[res.substr(0, 2)] >= 1) f = 1;
			
			else
			
				for (int j = 0; j < 26; j++)
				
					char ans = ('a' + j);
					if (mp[res + ans] >= 1) f = 1;
				
			
			if (mp[res] >= 1) f = 1;
		
		if (f) cout << "YES" << endl;
		else cout << "NO" << endl;
		mp.clear();
	
	return 0;

以上是关于Codeforces Round #767 (Div. 2) A ~ D的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #767 (Div. 2) A ~ D

Codeforces Round #767 (Div. 2) ABCD题解

Codeforces Round #767 (Div. 2)(A B C D E F1 F2)

Codeforces Round #436 E. Fire(背包dp+输出路径)

[ACM]Codeforces Round #534 (Div. 2)

CodeForces 767E(贪心)