Codeforces Round #634 (Div. 3)
Posted liyexin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #634 (Div. 3)相关的知识,希望对你有一定的参考价值。
题意:将n分成a,b。保证a>b,问有几种分法
解析:偶数输出n/2-1,奇数n/2即可
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<set> using namespace std; typedef long long ll; int main() { int t; cin>>t; while(t--) { ll n; cin>>n; if(n%2==0) cout<<n/2-1<<endl; else cout<<n/2<<endl; } }
题意:输出一个长为n的字符串,要求a长度里有b个不同字母
解析:其实弄来弄去还是只看一个len=a的串即可,比如abcabc,a=3, 从i=1到i=3和从i=2到i=4其实是同一个串而已,只是顺序不同罢了。所以根据要求构造成一个len=a,含有b个不同字符的串,然后把这个串依次往后接即可。自己写的有点麻烦......
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<set> using namespace std; typedef long long ll; char ch[2005],s[2005]; int main() { int t; cin>>t; while(t--) { int n,a,b; cin>>n>>a>>b; if(a==b) { int k=0; for(int i=0;i<n;i++) { char mid=(char)(k+‘a‘); k++; if(k==26) k=0; cout<<mid; } cout<<endl; } else { int k=0; int cnt=0; int mid; char md; for(int i=0;i<a;i++) { ch[i]=(char)(k+‘a‘); cnt++; if(cnt==b) { mid=i; md=ch[i]; break; } k++; } for(int i=mid+1;i<a;i++) ch[i]=md; int tot=0; for(int i=0;i<n;i++) { cout<<ch[tot]; tot++; if(tot==a-1) tot=0; } cout<<endl; } } }
题意:在一个数组中挑些数分成两组,一组各不相等,一组全相等。
解析:先统计出两个值,cnt:有多少种数。maxx:出现次数最多的数。然后把cnt--,这个cnt就是除了maxx以外有多少种数了。
然后分情况:1:cnt==maxx,没得说,直接输出cnt
2:maxx<cnt。没法进行补救,一组全相等我最大也就分出maxx,没法进行补救措施。这里给出样例:2 2 2 3 3 4 7 8 9供测试证明。
3:maxx>cnt。是有可能进行补救的。因为cnt是不包含maxx的,所以可以从maxx挪出来一个放入cnt中,但是要保证两组的元素数目相同,所以要看看maxx-1和cnt+1的大小关系。如果cnt+1>maxx-1了,那肯定是不能往里补的,只能输出cnt。能补的话,就输出cnt+1。给出两个样例:1 2 4 4 4 4 3和2 2 2 2 2 7 4。这俩一个能补一个不能补,可以自行测试一下。
#include<iostream> #include<cstdio> #include<cmath> #include<map> #include<algorithm> #include<cstring> using namespace std; typedef long long ll; const int maxn=2e5+10; int a[maxn]; int main() { int t; cin>>t; while(t--) { int n; cin>>n; map<int,int>mp; int maxx=-1,cnt=0; for(int i=0;i<n;i++) { cin>>a[i]; if(mp[a[i]]==0) cnt++; mp[a[i]]++; maxx=max(maxx,mp[a[i]]); } cnt--; // cout<<cnt<<"--"<<maxx<<endl; if(maxx==cnt) { cout<<maxx<<endl; continue; } else if(maxx<cnt) { cout<<maxx<<endl; } else { if(cnt+1>maxx-1) cout<<cnt<<endl; else cout<<cnt+1<<endl; } } }
题意:给你一个正确的9*9数独矩阵。对它改动不超过9次来实现每行每列每3*3都要有至少两个元素相同。
解析:这个重在对题意的理解。可以看出,给出的一定是每行每列每3*3都没有重复元素的。所以要让它变成反数独矩阵,只需要任意找一个数x,把所有的x变成y(x!=y)就可以了。这样,保证了每行每列都有重复元素,而对于3*3,已知输入的3*3里一定没有重复元素,那么1-9都出现在了3*3里,我们把x变成y,一定会出现重复。
#include<bits/stdc++.h> using namespace std; const int maxn=10; char s[maxn][maxn]; int main() { int t; cin>>t; while(t--) { for(int i=0;i<9;i++) cin>>s[i]; for(int i=0;i<9;i++) { for(int j=0;j<9;j++) { if(s[i][j]==‘3‘) s[i][j]=‘4‘; } } for(int i=0;i<9;i++) cout<<s[i]<<endl; } }
以上是关于Codeforces Round #634 (Div. 3)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #634 (Div. 3)
Codeforces Round #634 (Div. 3)
Codeforces Round #634 D. Anti-Sudoku(构造/水)
Codeforces Round #436 E. Fire(背包dp+输出路径)