注意这种情况:
4 1
4 1 8 3 4
两重for循环内还可以剪枝,比如2 1 4 3 6中遍历2时4、6符合条件,再往后的循环中46不必要在访问
原题链接:http://codeforces.com/problemset/problem/402/B
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<string>
#include<map>
#include<set>
#include<algorithm>
#include<vector>
#include<sstream>
using namespace std;
const int MAX_NUM = 1000+10;
int main()
{
int n,k;
int h[MAX_NUM],sub[MAX_NUM],vis[MAX_NUM];
memset (vis,0,sizeof (vis));
scanf ("%d%d",&n,&k);
for (int i=0;i<n;i++)
scanf ("%d",&h[i]);
int base=0,num,mnum=0;
for (int i=0;i<n;i++){
num=0;
if (h[i]-i*k<=0) continue;//数组内数字必须>0
for (int j=0;j<n;j++){
if (h[j]==h[i]+(j-i)*k)
num++;
}
if (num>mnum){
mnum=num;
base=i;
}
}
//printf ("%d-%d-",base,mnum);
printf ("%d\n",n-mnum);
for (int i = 0; i < n; i++){
int x=h[base]+(i-base)*k;
if (h[i]-x>0)
printf ("- %d %d\n",i+1,h[i]-x);
else if (h[i]-x<0)
printf ("+ %d %d\n",i+1,x-h[i]);
}
return 0;
}