Codeforces Round #151 (Div. 2)
A.解法:序列n,n-1,n-2...1就是不满足条件的,因为n-1被换到第一个之后就不会再改变位置了...
B.解法:如果这些数的总和能被n整除,那么经过多次操作肯定会让所有的数全变成sum/n,如果不能整除的话,那么就舍弃其中一个数,让其他的数都变成相同的某个值....
C.题意:给定n个不同的数,需要从中选出k组,其中每组的和都不一样...
解法:暴力构造就行了,别的没什么了...不过比赛的时候我还是sb了...
C
1 #include<iostream> 2 #include<vector> 3 #include<algorithm> 4 #include<cstring> 5 #include<set> 6 #define N 110 7 using namespace std; 8 typedef long long ll; 9 vector<ll>x; 10 vector< vector<ll> >ans[N]; 11 vector< ll >sum[N]; 12 set<ll>hash[N]; 13 ll s[N],ss[N]; 14 int main(){ 15 int n,kk; 16 while(cin>>n>>kk){ 17 memset(ss,0,sizeof(ss)); 18 for(int i=1;i<=n;i++) 19 cin>>s[i]; 20 sort(s+1,s+1+n); 21 for(int i=1;i<=n;i++) 22 ss[i]=ss[i-1]+s[i]; 23 x.clear(); 24 for(int i=1;i<=n;i++)hash[i].clear(); 25 x.push_back(s[1]); 26 ans[1].push_back(x); 27 sum[1].push_back(s[1]); 28 hash[1].insert(s[1]); 29 int w=1; 30 if(kk==1){ 31 cout<<1<<" "<<s[1]<<endl; 32 continue; 33 } 34 for(int i=2;i<=n;i++){ 35 x.clear(); 36 x.push_back(s[i]); 37 ans[i].push_back(x); 38 sum[i].push_back(s[i]); 39 hash[i].insert(s[i]); 40 for(int j=0;j<sum[i-1].size();j++){ 41 ll cnt; 42 cnt=sum[i-1][j]+s[i]; 43 if(!hash[i].count(cnt)){ 44 hash[i].insert(cnt); 45 x.clear(); 46 for(int k=0;k<ans[i-1][j].size();k++) 47 x.push_back(ans[i-1][j][k]); 48 x.push_back(s[i]); 49 ans[i].push_back(x); 50 sum[i].push_back(cnt); 51 } 52 cnt=sum[i-1][j]; 53 if(!hash[i].count(cnt)){ 54 hash[i].insert(cnt); 55 x.clear(); 56 for(int k=0;k<ans[i-1][j].size();k++) 57 x.push_back(ans[i-1][j][k]); 58 ans[i].push_back(x); 59 sum[i].push_back(cnt); 60 } 61 if(ans[i].size()>=kk){ 62 w=i; 63 break; 64 } 65 } 66 if(ans[i].size()>=kk){ 67 w=i; 68 break; 69 } 70 71 } 72 for(int i=0;i<kk;i++){ 73 cout<<ans[w][i].size()<<" "; 74 for(int j=0;j<ans[w][i].size();j++) 75 cout<<ans[w][i][j]<<" "; 76 cout<<endl; 77 } 78 } 79 return 0; 80 }
D.解法:用set随意搞搞就可以......
D
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<set> 5 #define N 100010 6 using namespace std; 7 typedef long long ll; 8 int s[N]; 9 set<int>x[N]; 10 int main(){ 11 int n,m; 12 while(cin>>n>>m){ 13 for(int i=0;i<N;i++)x[i].clear(); 14 int minnc=(1<<30); 15 for(int i=1;i<=n;i++){ 16 cin>>s[i]; 17 minnc=min(minnc,s[i]); 18 } 19 for(int i=1;i<=m;i++){ 20 int a,b; 21 cin>>a>>b; 22 if(s[a]!=s[b]){ 23 x[s[a]].insert(s[b]); 24 x[s[b]].insert(s[a]); 25 } 26 } 27 int maxn=-1,w; 28 for(int i=1;i<N;i++) 29 if(x[i].size()>0){ 30 int len=x[i].size(); 31 maxn=max(maxn,len); 32 } 33 if(maxn!=-1){ 34 for(int i=1;i<N;i++){ 35 if(x[i].size()==maxn){ 36 w=i; 37 break; 38 } 39 } 40 } 41 else{ 42 w=minnc; 43 } 44 cout<<w<<endl; 45 } 46 return 0; 47 }
E.暂时不会..thinking.....