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

该博客讨论了编程之美比赛中的一道题目,要求将序列转换为绝对递增序列,同时最小化变换过程中的消耗。博主通过二分法找到了解决策略,确保每个元素尽可能接近前一个元素的最小值,从而实现最小消耗。代码实现未给出,但博主认为此次比赛的题目难度较低。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值