CF998

A

link

总共就三组,看一下每一组如果满足要让它是多少,看看最多有几个相同的,最多有几个相同的就满足这些,就可以满足这么多组。

点击查看代码
#include<bits/stdc++.h>

using namespace std;

int a[10];
int c[5];

void qwq(){
	
	cin >> a[1] >> a[2] >> a[4] >> a[5];
	
	c[1] = a[1]+a[2];
	c[2] = a[4]-a[2];
	c[3] = a[5]-a[4];
	
	sort(c+1,c+4);
	
	if(c[1] == c[2]&&c[2] == c[3]) cout << 3;
	else if(c[1] == c[2]||c[2] == c[3]) cout << 2;
	else cout << 1;
	cout << endl;
	
}

signed main(){
	
	int t;
	cin >> t;
	while(t--) qwq();
	
	return 0;
	
}

B

link

以第一组数(\(0\)~\(n-1\))的顺序为准,看看后面的数是否符合这个顺序即可。
如果第一组数无法全部覆盖\(n\)个人,也就是说有人有\(1\)个以上第一组数,直接不行。

点击查看代码
#include<bits/stdc++.h>

using namespace std;

int n,m;
int c[2005][2005];
int p[2005];

void qwq(){
	
	cin >> n >> m;
	for(int i = 1;i <= n;++ i){
		for(int j = 1;j <= m;++ j){
			cin >> c[i][j];
		}
		sort(c[i]+1,c[i]+1+m);
	}
	
	for(int i = 1;i <= n;++ i){
		if(c[i][1] >= n){
			cout << -1 << endl;
			return;
		}
		p[c[i][1]+1] = i;
	}
	
	int tp = n;
	for(int j = 2;j <= m;++ j){
		for(int i = 1;i <= n;++ i){
			if(c[p[i]][j] != tp){
				cout << -1 << endl;
				return;
			}
			tp++;
		}
	}
	
	for(int i = 1;i <= n;++ i) cout << p[i] << " ";
	cout << endl;
	
}

signed main(){
	
	int t;
	cin >> t;
	while(t--) qwq();
	
	return 0;
	
}

C

link

先手是没有任何优势的,也就是说,如果有一对可以凑成\(k\),一定是可以用到的(先手选了,后手直接选配对的即可),就算有几对可以凑成\(k\)即可。

点击查看代码
#include<bits/stdc++.h>

using namespace std;

int n,k;
int x[200005];
int d[200005];
int cnt;

map<int,int> gs;

void qwq(){
	
	gs.clear();
	
	cin >> n >> k;
	for(int i = 1;i <= n;++ i)
		cin >> x[i],gs[x[i]]++;
	
	cnt = 0;
	sort(x+1,x+1+n);
	for(int i = 1;i <= n;++ i)
		if(x[i] != x[i-1]) d[++cnt] = x[i];
	
	int ans = 0;
	for(int i = 1;i <= cnt;++ i){
		int c = k-d[i];
		if(d[i] < c) ans += min(gs[d[i]],gs[c]);
		else if(d[i] == c) ans += gs[d[i]]/2;
		else break;
	}
	
	cout << ans << endl;
	
}

signed main(){
	
	int t;
	cin >> t;
	while(t--) qwq();
	
	return 0;
	
}

D

link

首先我们可以发现,题目中的操作一定会让一个数变成\(0\),而且如果一个数和那个\(0\)做操作一定是不变的。
那么如果做不到单调不减一定是有形如\(0、x、0\)\(x>0\))的东西,那么想要形成这样的东西,从头到尾的做一遍一定可以(脑补一下)
首先假设它先变成了\(0、x\),那么它后面会是\(0\)当且仅当后面一个数比\(x\)小,那么不管什么顺序,这个数只会变小不会变大,所以它一直会比\(x\)小,就一定会出现\(0、x、0\),所以我们从头到尾做一遍肯定和其他顺序答案是一样的。

点击查看代码
#include<bits/stdc++.h>

using namespace std;

int n;
int a[200005];

void qwq(){
	
	cin >> n;
	
	for(int i = 1;i <= n;++ i){
		cin >> a[i];
		if(i != 1){
			int t = min(a[i],a[i-1]);
			a[i] -= t;
			a[i-1] -= t;
		}
	}
	
	for(int i = 1;i < n;++ i){
		if(a[i] > a[i+1]){
			cout << "NO\n";
			return;
		}
	}
	
	cout << "YES\n";
	
}

signed main(){
	
	int t;
	cin >> t;
	while(t--) qwq();
	
	return 0;
	
}
posted @ 2025-01-31 21:36  我的晴语表  阅读(32)  评论(0)    收藏  举报