CF-Qpwoeirut And The City

如果n为奇数,那只有一种情况,就是从2开始间隔一个,到n - 1结束。如果n为偶数,则可能从2开始,也可能从3开始(无论从哪开始都到n - 1结束),还可能是两种情况的混合(在某一段从高低高低到高低底高)

#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
const int N = 2e5 + 10;
typedef long long LL;
typedef pair<int, int> PII;
int a[N];

LL ans1[N], ans2[N];
int main()
{
  int t;
  cin >> t;
   while(t --)
   {
      int n;
      cin >> n;
      // memset(ans1, 0, sizeof ans1);
      // memset(ans2, 0, sizeof ans2);之前超时了一发
      for(int i = 1; i <= n; i ++){
        cin >> a[i];
        ans1[i] = ans2[i]  = 0; 
      }
      LL ans = 0;
      if(n & 1)
      {
        for(int i = 2; i < n; i += 2)
        {
          if(a[i] <= a[i - 1] || a[i] <= a[i + 1]){
            ans += max(a[i - 1], a[i + 1]) - a[i] + 1;
          }
        }
      }
      
      else {
         ans = 2e14;
         for(int i = 2; i < n; i += 2)
         {
           if(a[i] <= a[i - 1] || a[i] <= a[i + 1]){
            ans1[i] = max(a[i - 1], a[i + 1]) - a[i] + 1;
          }
           if(i > 2)ans1[i] += ans1[i - 2];
         }
         
         for(int i = 3; i < n; i += 2)
         {
           if(a[i] <= a[i - 1] || a[i] <= a[i + 1]){
            ans2[i] = max(a[i - 1], a[i + 1]) - a[i] + 1;
          }
           if(i > 3)ans2[i] += ans2[i - 2];
         }
         
         for(int i = 2; i < n; i += 2)
         {
           ans = min(ans, ans1[i] + ans2[n - 1] - ans2[i  + 1]);
         }
         ans = min(ans, min(ans1[n - 2], ans2[n - 1]));
      }
      cout << ans << endl;
    }
      
   
}
全部评论

相关推荐

谁知道呢_:你好,我是炮灰n+1号
点赞 评论 收藏
分享
RickieOne:还有一个面试,上来就笔试算法 1️⃣ 字符串分割不能用 split ,ab&&c,根据&&放到数组上 2️⃣a 到 z 的全部组合情况,包括 a...z 3️⃣多线程,同时打印 1-200 4️⃣sql 代码 考分组 聚合 平均结合 小厂也这样吗,然后就八股 再拷打项目
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务