您的位置:首页 > 编程语言

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

2015-05-30 21:46 344 查看
题意: 给你一个序列 , 让你改变序列中的所有值, 最后保证序列变成一个绝对递增的序列 , 也就是每个a[i+1] 〉a[i], 然后有一个消耗为 max | a[i] - b[i]|, 问消耗最小为多少。

题解: 很显然 最大值最小问题, 明显二分, 然后再保证第一个最小的同时 , 后面的和第一个尽量靠近, 然后就A了 , 这次编程之美比赛题目确实好水呀, 没sei了!

代码:

[code]#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); 
   }    
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: