题意: 给你一个序列 , 让你改变序列中的所有值, 最后保证序列变成一个绝对递增的序列 , 也就是每个a[i+1] 〉a[i], 然后有一个消耗为 max | a[i] - b[i]|, 问消耗最小为多少。
题解: 很显然 最大值最小问题, 明显二分, 然后再保证第一个最小的同时 , 后面的和第一个尽量靠近, 然后就A了 , 这次编程之美比赛题目确实好水呀, 没sei了!
代码:
#include<stdio.h>
int n, mark[1000005], value[1000005];
int slove(int x)
{
for(int i = 1; i <= n; i++)
mark[i] = value[i];
// if(x >= mark[1]) mark[1] = 1;
mark[1] -= x;
for(int i = 2; i <= n; i++)
{
if(mark[i] + x <= mark[i-1])
return 0;
if(mark[i] - x > mark[i-1])
mark[i] -= x;
else mark[i] = mark[i-1] + 1;
}
return 1;
}
int main()
{
int T, flag1 = 1;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
int flag = 0, Max;
scanf("%d", &value[1]);
Max = value[1];
for(int i = 2; i <= n; i++)
{
scanf("%d", &value[i]);
if(value[i] <= value[i-1])
flag = 1;
if(Max < value[i]) Max = value[i];
}
printf("Case #%d:\n", flag1 ++);
if(!flag)
{
printf("0\n");
continue;
}
int l = 1, r = 1000004, mid, ans;
while(l <= r)
{
mid = (r+l)/2;
// printf("%d\n", mid);
if(slove(mid))
{
ans = mid;
r = mid - 1;
}
else l = mid + 1;
}
printf("%d\n", ans);
}
}
时间: 2024-10-25 12:46:47