这题昨天晚上花了我1个小时50多分钟来搞,都没有搞定。。后来看别人代码,直接暴力枚举第一个数的值来做。。最多1000*1000的复杂度。当时怎么就没想到呢?还有为啥我的方法不对呢。。
暴力方法代码:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #define Mod 1000000007 using namespace std; #define N 1007 int a[N]; int main() { int n,k,i,j,tmp,maxi,cnt,now,mini; while(scanf("%d%d",&n,&k)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&a[i]); mini = Mod; for(i=1;i<=1001;i++) { cnt = 0; tmp = i; for(j=1;j<=n;j++) { if(a[j] != tmp) cnt++; tmp += k; } if(cnt < mini) { mini = cnt; now = i; } } printf("%d\n",mini); tmp = now; for(i=1;i<=n;i++) { if(a[i] > tmp) printf("- %d %d\n",i,a[i]-tmp); else if(a[i] < tmp) printf("+ %d %d\n",i,tmp-a[i]); tmp += k; } } return 0; }
自己的做法:
做一个参考数组b[],存放1,1+k,1+2k....1+(n-1)k,然后a,b两数组(a为原数组)个元素相减,得出差值数组cha,且将cha复制一份给cha2,将cha2从大到小排序,得出差值大于0的最大连续相同的差值(差值小于0肯定不行,因为从1开始的b数组是底线,比b还小说明会小于0,与题意不符),以最大连续差值的这些数为基准,这些数不变,将其他数变为使整个数组满足Ai+1-Ai = k,此时形成标准数组biao[],然后比较a[]和biao[],得出操作数和操作序列。但是就是不对,,不知道为啥,那位好心人如果发现这样那里不对欢迎向我指出,谢谢。
自己代码:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #define Mod 1000000007 using namespace std; #define N 1007 int a[N],biao[N],cha[N],b[N],cha2[N]; int cmp(int ka,int kb) { return ka>kb; } int main() { int n,k,i,j,flag; while(scanf("%d%d",&n,&k)!=EOF) { for(i=1;i<=n;i++) scanf("%d",&a[i]); for(i=1;i<=n;i++) b[i] = 1+(i-1)*k; for(i=1;i<=n;i++) { cha[i] = a[i]-b[i]; cha2[i] = cha[i]; } sort(cha2+1,cha2+n+1,cmp); int cnt = 1; int maxi = 0; for(i=2;i<=n;i++) { if(cha2[i] < 0) break; if(cha2[i] == cha2[i-1]) cnt++; else { if(cnt > maxi) { maxi = cnt; flag = cha2[i-1]; cnt = 1; } } } if(cnt > maxi) { maxi = cnt; flag = cha2[i-1]; } for(i=1;i<=n;i++) { if(cha[i] == flag) { break; } } for(j=i;j>=1;j--) biao[j] = a[i]-k*(i-j); for(j=i+1;j<=n;j++) biao[j] = a[i]+k*(j-i); cnt = 0; for(i=1;i<=n;i++) { if(a[i]!=biao[i]) cnt++; } printf("%d\n",cnt); for(i=1;i<=n;i++) { if(a[i] != biao[i]) { if(a[i] > biao[i]) { printf("- %d %d\n",i,a[i]-biao[i]); } else printf("+ %d %d\n",i,biao[i]-a[i]); } } } return 0; }