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].....,问这样的数有多少个?输出出来。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }