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。。。图论。。??暂时不会。。。