Codeforces Round #656 (Div. 3) C. Make It Good (贪心,模拟)
阅读原文时间:2023年07月08日阅读:1

  • 题意:给你一个数组\(a\),可以删除其前缀,要求操作后得到的数组是"good"的.对于"good":可以从数组的头和尾选择元素移动到新数组,使得所有元素移动后得到的新数组是非递减的.问最少删除前多少个元素满足条件.

  • 题解:因为只删除前缀,所以我们可以倒着来看,感觉自己搞复杂了.

    ​ 假如数组从最后一位开始倒着递增的话,当我们遇到第一个不满足递增的位置时,只要要求从这个位置开始向左递减即可.

    ​ 假如数组从最后一位开始倒着递减的话,那它就只能一直递减下去,即遇到的第一个不满足的位置,那就必须要删到这个位置.

  • 代码:

    int t;
    int n;
    int a[N];
    
    int main() {
        ios::sync_with_stdio(false);cin.tie(0);
          cin>>t;
           while(t--){
              cin>>n;
               for(int i=1;i<=n;++i){
                  cin>>a[i];
               }
               int pos=n;
               int now=1;
               for(int i=n;i>=1;--i){
                  if(a[i]>a[i-1]){
                      pos=i-1;
                      break;
                  }
               }
               for(int i=pos;i>=1;--i){
                  if(a[i]<a[i-1]){
                      now=i;
                      break;
                  }
               }
               int ans=n;
               ans=now-1;
           cout&lt;&lt;ans&lt;&lt;endl;
    
       }
    
    return 0;
    }