Codeforces Round #224 (Div. 2)
题目:http://codeforces.com/contest/382
一个求天平是否能够平衡的题目。。。水题,注意一下结果的输出就行。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 using namespace std; 7 8 int main() 9 { 10 int i,len; 11 int L,R,x,sum; 12 char a[10000],b[10000]; 13 while(~scanf("%s",a)) 14 { 15 L=0; R=0; 16 for(i=0; i<strlen(a); i++) 17 { 18 if(a[i]=='|') 19 break; 20 L++; 21 } 22 R=strlen(a)-1-L; 23 scanf("%s",b); 24 len=strlen(b); 25 x=abs(L-R); 26 27 if(x>len) 28 printf("Impossible\n"); 29 else if((len-x)%2==1) 30 printf("Impossible\n"); 31 else 32 { 33 sum=L+R+len; 34 for(i=0; i<L; i++) 35 printf("%c",a[i]); 36 for(i=0; i<sum/2-L; i++) 37 printf("%c",b[i]); 38 39 printf("%c",a[L]); 40 for(i=sum/2-L; i<len; i++) 41 printf("%c",b[i]); 42 for(i=L+1; i<strlen(a); i++) 43 printf("%c",a[i]); 44 printf("\n"); 45 } 46 } 47 return 0; 48 }
已知n个数,再给一个数,求有多少种数,能使序列构成等差数列。。
比赛的时候思路有的混乱,没做,今天做了一下,1Y
网上还有按照 间隔分的做法,思路差不多。。代码也挺长的。。。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <map> 6 #include <algorithm> 7 using namespace std; 8 9 int a[100005],b[100005]; 10 int n; 11 int check(int d[],int ant)//判断是否符合等差数列的条件 12 { 13 int i,x; 14 for(i=0; i<n; i++) 15 b[i]=d[i]; 16 17 b[n]=ant; 18 sort(b,b+n+1); 19 x=b[1]-b[0]; 20 for(i=2; i<=n; i++) 21 { 22 if((b[i]-b[i-1])!=x) 23 return 0; 24 } 25 return 1; 26 } 27 28 int main() 29 { 30 int i,f,x,sum,ans; 31 while(~scanf("%d",&n)) 32 { 33 map<int,int>mp; 34 map<int,int>::iterator iter; 35 x=0; 36 for(i=0; i<n; i++) 37 scanf("%d",&a[i]); 38 39 if(n==1) //特判 40 printf("-1\n"); 41 else 42 { 43 sort(a,a+n); 44 f=0; 45 for(i=1; i<n; i++) 46 if(a[i-1]==a[i]) 47 { 48 f=1; break; 49 } 50 51 if(a[0]==a[n-1])//特判 52 printf("1\n%d\n",a[0]); 53 else if(f) 54 printf("0\n");//特判 55 else 56 { 57 x=a[1]-a[0]; 58 if(check(a,a[0]-x)) //情况1,假设前两个与整个序列相符合,而且整个序列已经等差,前面 59 { 60 mp[a[0]-x]++; 61 } 62 if(check(a,a[n-1]+x)&&mp[a[n-1]+x]==0)//情况1,假设前两个与整个序列相符合,而且整个序列已经等差,后面 63 mp[a[n-1]+x]++; 64 for(i=2; i<n; i++) //情况2,假设前两个与整个序列相符合,而且整个序列没有等差 65 { 66 if((a[i]-a[i-1])!=x) 67 { 68 if(check(a,a[i-1]+x)&&mp[a[i-1]+x]==0) 69 mp[a[i-1]+x]++; 70 break; 71 } 72 } 73 if(n>=3) //情况3,假设前两个与整个序列相符合 74 { 75 x=a[2]-a[1]; 76 if(check(a,a[0]+x)&&mp[a[0]+x]==0) 77 mp[a[0]+x]++; 78 } 79 else //情况4,只有两个,取中间的值 80 { 81 if((a[0]+a[1])%2==0) 82 { 83 if(check(a,(a[0]+a[1])/2)&&mp[(a[0]+a[1])/2]==0) 84 mp[(a[0]+a[1])/2]++; 85 } 86 } 87 sum=0; 88 iter=mp.begin(); 89 while(iter!=mp.end()) 90 { 91 sum++; 92 iter++; 93 } 94 if(sum==0) 95 printf("%d\n",sum); 96 else 97 { 98 printf("%d\n",sum); 99 ans=0; 100 iter=mp.begin(); 101 while(iter!=mp.end()) 102 { 103 ans++; 104 if(ans!=sum) 105 printf("%d ",iter->first); 106 else 107 printf("%d\n",iter->first); 108 iter++; 109 } 110 } 111 } 112 } 113 } 114 return 0; 115 }