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随意搞搞就可以......

 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.....

posted @ 2012-11-22 12:44  silver__bullet  阅读(173)  评论(0编辑  收藏  举报