题意:有n棵树,第i棵高ai,女皇要求每棵树按k递增,每次操作可 + 或 - 树任意高度,输出最少操作数,并输出所有操作。
思路:n<1000;建一数组b[i] 按k递增,再建一数组c[j](-1000<=j<=1000)记录 a[i]-b[i] 出现次数最多的值 t; b[i]+t即为女皇要求看到的状态,且操作数最少。
曲折:RE因为没考虑b[i]有可能超过1000,WA因为没考虑最终情况树高不能低于0;
Accepted | 31 ms | 12 KB |
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[1010],b[1010],c[2020]={0};
int n, k, i, max=0, t;
scanf("%d%d", &n, &k);
b[1] = 1;
for(i = 1; i <= n; i++)
{
if(i-1) b[i] = b[i-1] + k;
scanf("%d", &a[i]);
if(b[i] <= 1000) c[a[i]-b[i]+1010]++;
}
for(i = 1011 - b[1]; i < 2020; i++)
{
if(c[i] > max) {max = c[i]; t = i-1010;}
}
printf("%d\n",n-max);
for(i = 1; i <= n; i++)
{
b[i] += t;
if(a[i]-b[i] == 0) continue;
if(a[i]-b[i] > 0) printf("- %d %d\n", i, a[i]-b[i]);
else printf("+ %d %d\n", i, b[i]-a[i]);
}
return 0;
}