码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-05-31 09:25:26      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:

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

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

标签:

原文地址:http://blog.csdn.net/q651111937/article/details/46278615

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!