Educational Codeforces Round 142 (Rated for Div. 2) C. Min Max Sort

题目链接:https://codeforces.com/contest/1792/problem/C

题意:

输入乱序的1到n的排序数组,有三种操作使其有序:

  1. 选择x和y俩个元素将他们从数组中去除。

  1. 在x和y中选择小的插入到队头

  1. 在x和y中选择大的插入到队尾

理解:对于2,3操作其实都只是让2个数字有序,那么将俩个不合理的数字去掉数组同样也可以变得有序,所以可以都用同一种操作,就是1操作,对于不合理的直接去掉就可以了。

那么最大的操作次数就是n/2,此时数组为0或1.

去除数字应该从中间的去除,如果说中间的数字有不合理的地方,那就没有再排序的必要了,直接去掉,否则就由内到外去遍历看看是否符合顺序。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5;
int a[2*N];
int pos[2*N];
int t,n;

int main()
{
    ios::sync_with_stdio(false);
    cin>>t;
    while(t--){
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            pos[a[i]]=i;//确定各个数字应该的位置
        }
        int ans=(n%2==1);
        for(int i=1;i<=n/2;i++){
            int l,r;
            //由中间到外依次比较顺序
            if(n%2==1){
                l=(n+1)/2-(ans+1)/2;
                r=(n+1)/2+(ans+1)/2;
                if(l<1||pos[r]-pos[r-1]<0||pos[l+1]-pos[l]<0) break;
                ans+=2; 
            }
            else {
                l=n/2-ans/2;
                r=n/2+1+ans/2;
                if(l<1||pos[r]-pos[r-1]<0||pos[l+1]-pos[l]<0) break;
                ans+=2;
            }
        }
//        cout<<ans<<endl;
        没被保留的数字就是需要操作的,都按删除2个处理
        cout<<(n-ans)/2<<endl;
        
    }
    

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃芒果的蘑菇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值