序列变换
Accepts: 816
Submissions: 3578
Time Limit: 4000/2000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
挺有含金量的题目。
首先做一个等价,问题“满足条件的最小代价“(其中代价为cost(A, B) = max(|Ai - Bi|)(1 <= i <= N))可以等价为”给定一个数组,找到一个<i, j>,i < j, 使得其满足Ai - Aj + j - i 最小“,然后再等价为”找到Ai - i 的最大值和最小值,若最小值出现在最大值之前,则该数组最小代价为0;若最大值出现在最小值之前,则(max - min) / 2 + (max - min) % 2 就是最小代价。“
这种思路可以用数学归纳法证明。我得出这种思路是用的举例观察,然后部分归纳。
#include <stdio.h>
int main()
{
int T, N, i, j, k;
scanf("%d", &T);
for(i = 0; i < T; i++) {
scanf("%d", &N);
int cost, m, bestCost = 0;
scanf("%d", &m);
int min = m, max = m, minJ = 0, maxJ = 0;
for(j = 1; j < N; j++) {
scanf("%d", &m);
m = m - j;
if(m <= min) {min = m; minJ=j;}
else if(m > max) {max = m; maxJ=j;}
}
if(maxJ < minJ) bestCost = max - min;
printf("Case #%d:\n", i+1);
printf("%d\n", bestCost / 2 + bestCost % 2);
}
return 0;
}