编程之美第三题 序列变换tiyi

来源:互联网 发布:linux装tensorflow 编辑:程序博客网 时间:2024/06/11 05:02

题意:   给你一个序列  ,  让你改变序列中的所有值,  最后保证序列变成一个绝对递增的序列   ,  也就是每个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);    }    } 

0 0