cf C. Arithmetic Progression

http://codeforces.com/contest/382/problem/C

题意:给你n个数,然后让你添加一个数使得n+1个数能形成这样的规律,a[1]-a[0]=a[2]-a[1]=a[3]-a[2].....,问这样的数有多少个?输出出来。

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <algorithm>
  4 #include <map>
  5 #define maxn 100001
  6 using namespace std;
  7 
  8 int n;
  9 int a[maxn];
 10 int b[maxn];
 11 
 12 int main()
 13 {
 14     while(scanf("%d",&n)!=EOF)
 15     {
 16         map<int,int>q;
 17         int cnt=0;
 18         for(int i=0; i<n; i++)
 19         {
 20             scanf("%d",&a[i]);
 21         }
 22         sort(a,a+n);
 23         if(n==1)
 24         {
 25             printf("-1\n");
 26             continue;
 27         }
 28         if(n==2)
 29         {
 30             if((a[0]+a[1])%2==0)
 31             {
 32                 int m=(a[0]+a[1])/2-a[0];
 33                 if((a[0]+a[1])/2==a[0])
 34                 {
 35                     printf("1\n");
 36                     printf("%d\n",a[0]);
 37                     continue;
 38                 }
 39                 printf("%d\n",3);
 40                 printf("%d %d %d\n",a[0]-(a[1]-a[0]),a[0]+m,a[1]+m*2);
 41             }
 42             else
 43             {
 44                 printf("%d\n",2);
 45                 int m=a[1]-a[0];
 46                 printf("%d %d\n",a[0]-m,a[1]+m);
 47             }
 48             continue;
 49         }
 50         if(n==3)
 51         {
 52             int m1=a[1]-a[0];
 53             int m2=a[2]-a[1];
 54             if(m1>m2)
 55             {
 56                 if(m1==m2*2)
 57                 {
 58                     printf("%d\n",1);
 59                     printf("%d\n",a[0]+m2);
 60                 }
 61                 else
 62                 {
 63                     printf("0\n");
 64                 }
 65             }
 66             else if(m1<m2)
 67             {
 68                 if(m2==m1*2)
 69                 {
 70                     printf("%d\n",1);
 71                     printf("%d\n",a[1]+m1);
 72                 }
 73                 else
 74                 {
 75                     printf("0\n");
 76                 }
 77             }
 78             else if(m1==m2)
 79             {
 80                 if(a[0]==a[1])
 81                 {
 82                     printf("1\n");
 83                     printf("%d\n",a[0]);
 84                     continue;
 85                 }
 86                 printf("2\n");
 87                 printf("%d %d\n",a[0]-m1,a[n-1]+m1);
 88             }
 89             continue;
 90         }
 91         int k;
 92         int max1=0;
 93         bool flag1=true;
 94         for(int i=1; i<n; i++)
 95         {
 96             int m=a[i]-a[i-1];
 97             if(m==0)
 98             {
 99                 flag1=false;
100             }
101             if(q[m]==0)
102             {
103                 q[m]=1;
104             }
105             else
106                 q[m]++;
107             if(q[m]>max1)
108             {
109                 max1=q[m];
110                 k=m;
111             }
112         }
113         if(!flag1)
114         {
115             if(k!=0)
116             {
117                 printf("0\n");
118                 continue;
119             }
120         }
121         if(k==0)
122         {
123             bool flag=true;
124             for(int i=1; i<n; i++)
125             {
126                 if(a[i]-a[i-1]!=k)
127                 {
128                     flag=false;
129                     printf("0\n");
130                     break;
131                 }
132             }
133             if(flag==true)
134             {
135                 printf("1\n");
136                 printf("%d\n",a[0]);
137             }
138         }
139         else
140         {
141             int f=0;
142             for(int i=1; i<n; i++)
143             {
144                 if(a[i]-a[i-1]!=k)
145                 {
146                     if(f==1)
147                     {
148                         f=2;
149                         printf("0\n");
150                         break;
151                     }
152                     else if(f==0)
153                     {
154                         f=1;
155                         if((a[i]+a[i-1])%2!=0)
156                         {
157                             printf("0\n");
158                             f=2;
159                             break;
160                         }
161                         else
162                         {
163                             if((a[i]+a[i-1])/2==a[i-1]+k)
164                                 b[cnt++]=(a[i]+a[i-1])/2;
165                             else
166                             {
167                                 f=2;
168                                 printf("0\n");
169                                 break;
170                             }
171                         }
172                     }
173                 }
174             }
175             if(f==0)
176             {
177                 b[cnt++]=a[0]-k;
178                 b[cnt++]=a[n-1]+k;
179             }
180             if(f==2) continue;
181             sort(b,b+cnt);
182             printf("%d\n",cnt);
183             for(int i=0; i<cnt; i++)
184             {
185                 if(i==0)
186                     printf("%d",b[i]);
187                 else printf(" %d",b[i]);
188             }
189             printf("\n");
190         }
191     }
192 }
View Code

 

posted @ 2014-12-31 20:27  null1019  阅读(197)  评论(0编辑  收藏  举报