Codeforces Round #224 (Div. 2)

题目:http://codeforces.com/contest/382

 

Ksenia and Pan Scales

一个求天平是否能够平衡的题目。。。水题,注意一下结果的输出就行。

 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 }

 

Arithmetic Progression

已知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 }

 

posted @ 2014-01-18 10:49  水门  阅读(218)  评论(0编辑  收藏  举报