返回顶部

Codeforces Round #656 (Div. 3) C. Make It Good (贪心,模拟)

  • 题意:给你一个数组\(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<<ans<<endl;
             
      	 }
    
        return 0;
    }
    
posted @ 2020-07-18 01:20  _Kolibri  阅读(292)  评论(0)    收藏  举报