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;
}

浙公网安备 33010602011771号