网站:http://www.bnuoj.com/bnuoj/contest_show.php?cid=2009#info
A,水题,不解释;
B ,放代码
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 #include<string> 5 #include<string.h> 6 using namespace std; 7 int main() 8 { 9 int a,b,s=0,n,i=0,x; 10 char d,c[5]; 11 while(scanf("%d%c%d%*c%s",&a,&d,&b,c)!=EOF) 12 { 13 i++; 14 if(d=='+') 15 n=a+b; 16 else 17 n=a-b; 18 if(n<0&&c[0]=='?') 19 s++; 20 else 21 { 22 x=strlen(c); 23 if(x==1&&n==(c[0]-'0')&&n>=0&&n<10) 24 s++; 25 else if(x==2&&n>9&&n<100&&(n%10==c[1]-'0')&&(n/10==c[0]-'0')) 26 s++; 27 else if(n>99&&x==3&&(n%10==c[2]-'0')&&((n/10)%10==c[1]-'0')&&(n/100==c[0]-'0')) 28 s++; 29 } 30 if(i==100) 31 break; 32 } 33 printf("%d ",s); 34 return 0; 35 }
C,也不解释,放代码:
1 #include<stdio.h> 2 #include<string.h> 3 int main() 4 { 5 char a[1000]; 6 int b[1000],i,flag,n; 7 while(scanf("%s",a) && a[0]!='0') 8 { 9 flag=0; 10 n=strlen(a); 11 for(i=0;i<n;i++) 12 b[i]=a[i]-'0'; 13 for(i=0;i<n-1;i++) 14 { 15 flag=flag*10+b[i]; //一位位取余 16 flag=flag%17; 17 } 18 flag=(flag-b[n-1]*5)%17; 19 if(flag) 20 printf("0 "); 21 else 22 printf("1 "); 23 } 24 return 0; 25 }
D:....先不写....
E:水题,不解释。
F:不难,就是输出“-1”那略坑,根本没有输出-1的时候嘛.....
1 #include <stdio.h> 2 int judge(int n) 3 { 4 if(n%7==0) 5 return 1; 6 while(n) //等于0跳出 7 { 8 if(n%10==7) return 1; //或者有一位数为7跳出 9 n/=10; 10 } 11 return 0; 12 } 13 int main() 14 { 15 int n,m,k; 16 while(~scanf("%d%d%d",&n,&m,&k)&& (n||m||k)) 17 { 18 int cur=1,add,num=0; 19 while(k) 20 { 21 ++num; 22 if(cur==m) 23 k-=judge(num); 24 if(cur==n) add=-1; 25 if(cur==1) add=1; 26 cur+=add; 27 } 28 printf("%d ",num); 29 } 30 return 0; 31 }
G:找规律~
1 #include <stdio.h> 2 #include<iostream> 3 using namespace std; 4 int main() 5 { 6 int n,sum; 7 while(~scanf("%d",&n)&&n) 8 { 9 sum=1; 10 for(;;) 11 { 12 sum=sum*2+1; 13 if(n<=sum) 14 break; 15 } 16 if(n==sum) 17 printf("Bob "); 18 else 19 printf("Alice "); 20 } 21 return 0; 22 }
另附上网上有力的解释:
首先分析简单的情况,数字代表最大堆,2必胜,3必输,4必胜,……其实偶数必胜是显然的,但奇数就不好说了,于是我们换个角度考虑。
如果说3必输的话,那么最后能把最大堆是3的情况留给Bob那么自己必然会赢,而能确保最大堆是3的情况就只有4、5、6了,而对于7,无论自己如何设置,都会把4、5、6其中的一个留给Bob,故自己必输。
同理,7必输的话,把7留给Bob就必胜,于是……
这样推完,其实Bob能赢的情况就是在n=2^k-1(k = 2, 3, 4,…)的时候,其他时候Alice都是必胜的。
H......
I:我现在都不知道错哪......
先贴上正确的代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <string> 5 6 using namespace std; 7 8 int map[122][122]; 9 10 int N, K, M; 11 12 int main() 13 { 14 int T; 15 int a, b; 16 while (scanf("%d", &T) != EOF) 17 { 18 while (T--) 19 { 20 memset(map, 0, sizeof(map)); 21 scanf("%d%d%d", &N, &M, &K); 22 for (int i = 0; i < M; i++) 23 { 24 scanf("%d%d", &a, &b); 25 map[a][b] = 1; 26 map[b][a] = 1; 27 } 28 int ans = 0; 29 while (1) 30 { 31 int count = 0; 32 for (int i = 0; i < N - 1; i++) 33 { 34 for (int j = i + 1; j < N; j++) 35 { 36 int cnt = 0; 37 if (!map[i][j]) 38 { 39 for (int k = 0; k < N; k++) 40 { 41 if (map[i][k] && map[j][k]) 42 { 43 cnt++; 44 } 45 } 46 if (cnt >= K && !map[i][j]) 47 { 48 map[i][j] = 1; 49 map[j][i] = 1; 50 // cout << "i == " << i << "j == " << j << endl; 51 count++; 52 } 53 } 54 } 55 } 56 ans += count; 57 if (count == 0) 58 { 59 break; 60 } 61 } 62 printf("%d ", ans); 63 } 64 } 65 // system("pause"); 66 return 0; 67 } //来自http://blog.csdn.net/qinaide_lixiaoshuo/article/details/8945349
再是我自己的错误的代码:
1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 using namespace std; 5 int main() 6 { 7 int T,a[80000],b[80000],i,j,k,r,Q; 8 int p[250][250],map[250][250]; 9 scanf("%d",&T); 10 while(T--) 11 { 12 int m,n,g,sum=0; 13 scanf("%d%d%d",&m,&n,&g); 14 memset(p,0,sizeof(p)); 15 memset(map,0,sizeof(map)); 16 for(i=0;i<n; i++) 17 { 18 scanf("%d%d",&a[i],&b[i]); 19 map[a[i]][b[i]]=1; 20 map[b[i]][a[i]]=1; 21 } 22 Q=1; 23 for(r=0;r<Q;r++) 24 { 25 r=0; 26 Q=0; 27 for(i=0;i<m-1;i++) 28 for(j=1+i;j<m;j++) 29 for(k=0;k<m;k++) 30 if(map[i][k]==1 && map[j][k]==1 && map[i][j]==0) 31 { 32 p[i][j]++; 33 p[j][i]++; 34 } 35 for(i=0;i<m-1;i++) 36 for(j=i+1;j<m;j++) 37 if(p[i][j]>=g) 38 { 39 sum++; 40 p[i][j]=-100000; 41 p[j][i]=-100000; 42 map[i][j]=1; 43 map[j][i]=1; 44 Q=2; 45 } 46 } 47 printf("%d ",sum); 48 } 49 return 0; 50 }
J:没什么好说的额,直接暴力:
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 int main() 5 { 6 int T,a[440],maxm,i,sum,j; 7 scanf("%d",&T); 8 while(T--) 9 { 10 maxm=0; 11 int m,n; 12 scanf("%d%d",&m,&n); 13 for(i=0;i<m;i++) 14 scanf("%d",&a[i]); 15 for(i=m; i<2*m-1; i++) 16 a[i]=a[i-m]; 17 for(i=0;i<m; i++) 18 { 19 sum=0; 20 for(j=0;j<n;j++) 21 sum+=a[i+j]; 22 if(sum>maxm) 23 maxm=sum; 24 } 25 printf("%d ",maxm); 26 } 27 return 0; 28 }
K :题目大意是给你两个砝码,你可以把其中的一个拆成两个,使得能称出来的数字最多。
这道题用枚举都能做出来,现在用一种简单的方法: 0MS
1 #include<stdio.h> 2 #include<iostream> 3 #include<math.h> 4 #include<string.h> 5 using namespace std; 6 int g(int a,int b,int c) 7 { 8 int i,j,k,sum=0; 9 int w[3],r[300]; 10 memset(w,0,sizeof(w)); 11 memset(r,0,sizeof(r)); 12 r[0]=1; //要注意这里 13 for(i=0;i<=2;i++) 14 { 15 w[i]+=a; 16 for(j=0;j<=2;j++) 17 { 18 w[j]+=b; 19 for(k=0;k<=2;k++) 20 { 21 w[k]+=c; 22 int t=fabs(w[1]-w[2]); 23 if(!r[t]) //标记,如果t出现过,r[t]==1; 24 { 25 r[t]=1; 26 sum++; 27 } 28 w[k]-=c; 29 } 30 w[j]-=b; 31 } 32 w[i]-=a; 33 } 34 return sum; 35 } 36 37 int f(int a,int b) 38 { 39 int c,sum=0; 40 for(c=1;c<=a/2;c++) 41 sum=max(sum,g(a-c,c,b)); 42 return sum; 43 } 44 int max(int a,int b) 45 { 46 return a>=b?a:b; 47 } 48 int main() 49 { 50 int T,a,b; 51 scanf("%d",&T); 52 while(T--) 53 { 54 scanf("%d%d",&a,&b); 55 printf("%d ",max(f(a,b),f(b,a))); //拆a,或者拆b 56 } 57 return 0; 58 }
再给出一个神代码,很短,但是耗时 40MS
1 #include<cstdio> 2 #include<set> 3 #include<algorithm> 4 5 short T; 6 int x,y,a,b,c; 7 std::set<int>set; 8 int ans,cnt,i,j,k; 9 10 inline void go() 11 { 12 for(a=1;a<x;++a) 13 { 14 set.clear(); 15 for(i=-1;i<2;++i) 16 for(j=-1;j<2;++j) 17 for(k=-1;k<2;++k) 18 set.insert(abs(a*i+(x-a)*j+y*k)); 19 ans=std::max(ans,(int)set.size()); 20 } 21 } 22 23 int main() 24 { 25 scanf("%hd",&T); 26 while(T--) 27 { 28 scanf("%d %d",&x,&y); 29 ans=0; 30 go(); 31 std::swap(x,y); 32 go(); 33 printf("%d ",ans-1); 34 } 35 return 0; 36 }
表示不懂,没学过set.......Mark一下