Codeforces Round #147 (Div. 2)

 A.

  排序,把h,m都相同的归为一类,找到最多的

  

A
 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<map>
 5 #define N 100010
 6 using namespace std;
 7 struct H{
 8     int h,m;
 9 }s[N];
10 int hash[N];
11 bool cmp(H a,H b){
12     if(a.h!=b.h)return a.h<b.h;
13     return a.m<b.m;
14 }
15 int main(){
16     int n;
17     while(cin>>n){
18         for(int i=1;i<=n;i++)
19             cin>>s[i].h>>s[i].m;
20         sort(s+1,s+1+n,cmp);
21         int maxn=1;
22         int a=1;
23         for(int i=2;i<=n;i++){
24             if(s[i].h==s[i-1].h&&s[i].m==s[i-1].m)++a;
25             else{
26                 maxn=max(a,maxn);
27                 a=1;
28             }
29         }
30         maxn=max(maxn,a);
31         cout<<maxn<<endl;
32     }
33     return 0;
34 }

B.

  比赛的时候读错题了,一直以为必须要保证交换次数最少。。。于是悲剧了。。。

  一共只有s个元素,并且要求交换次数不超过s..乱搞即可

B
 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define N 110
 5 #define M 3010
 6 using namespace std;
 7 int c[N];
 8 int s[N][N];
 9 int a[N][N];
10 int hash[M][2];
11 int ans[M][4];
12 
13 int main(){
14     int n;
15     while(cin>>n){
16         for(int i=1;i<=n;i++)cin>>c[i];
17         int cnt=0;
18         for(int i=1;i<=n;i++)
19             for(int j=1;j<=c[i];j++){
20                 a[i][j]=++cnt;
21                 cin>>s[i][j];
22                 hash[s[i][j]][0]=i;
23                 hash[s[i][j]][1]=j;
24             }
25         int cc=0;
26         for(int i=1;i<=n;i++)
27             for(int j=1;j<=c[i];j++){
28                 if(s[i][j]!=a[i][j]){
29                     int &x=hash[a[i][j]][0];
30                     int &y=hash[a[i][j]][1];
31                     ans[++cc][0]=i;
32                     ans[cc][1]=j;
33                     ans[cc][2]=x;
34                     ans[cc][3]=y;
35                     s[x][y]=s[i][j];
36                     hash[s[i][j]][0]=x;
37                     hash[s[i][j]][1]=y;
38                     s[i][j]=a[i][j];
39                     hash[a[i][j]][0]=i;
40                     hash[a[i][j]][1]=j;
41                 }
42             }
43         cout<<cc<<endl;
44         for(int i=1;i<=cc;i++)
45             cout<<ans[i][0]<<" "<<ans[i][1]<<" "<<ans[i][2]<<" "<<ans[i][3]<<endl;
46     }
47     return 0;
48 }

C.给定一段区间,找出一个最小的长度l,使得区间内任意[x,x+l-1]内至少有k个素数。

  可以二分枚举l做...

  我的做法是先预处理出s[i],hash[i],分别表示i之前有几个素数,第i个素数是什么,那么从i开始的最短的包含k个素数的区间就是[ i,hash [ s[i-1] +k ] ],扫一遍即可,另外要注意下区间内最有一个素数和右端点的距离。。。

C
 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define N 1000010
 5 using namespace std;
 6 bool p[N];
 7 int s[N],hash[N];
 8 void init(){
 9     memset(p,1,sizeof(p));
10     for(int i=2;i*i<N;i++)
11         for(int j=i;j*i<N;j++)
12             p[i*j]=0;
13     p[1]=0;
14     memset(s,0,sizeof(s));
15     for(int i=1;i<N;i++){
16         s[i]=s[i-1];
17         if(p[i])s[i]++;
18     }
19     int cnt=0;
20     for(int i=1;i<N;i++){
21         if(s[i]!=s[i-1]){
22             hash[++cnt]=i;
23         }
24     }
25 }
26 int main(){
27     init();
28     int a,b,k;
29     while(cin>>a>>b>>k){
30         if(s[b]-s[a-1]<k)cout<<-1<<endl;
31         else{
32             int ans=-1;
33             int w;
34             for(int i=a;hash[s[i-1]+k]<=b;i++){
35                 ans=max(ans,hash[s[i-1]+k]-i+1);
36                 if(hash[s[i]+k]>b){
37                     w=b-i+1;
38                 }
39             }
40             ans=max(ans,w);
41             cout<<ans<<endl;
42         }
43     }
44     return 0;
45 }

D.E。。。图论。。??暂时不会。。。

posted @ 2012-10-26 06:58  silver__bullet  阅读(233)  评论(0编辑  收藏  举报