Educational Codeforces Round 76 (Rated for Div. 2)

1257A - Two Rival Students  

有一对素质同桌处于 a,b 两个位置,每一次他们都可以向右或向左移动 1 位,有 k 次机会,问最多可以多远 

int main()
{
    rush(){
        int a,b;
        cin>>n>>k>>a>>b;
        if(a>b) swap(a,b);
        int dis=b-a;
        int res=n-(dis+1);
        int ans;
        if(k>=res) ans=n-1;
        else ans=dis+k;
        cout<<ans<<endl;
    }
    //PAUSE;
    return 0;
}

B - Magic Stick 

有两个数 x , y 如果 x 是偶数则可以 x/2*3 的操作,若 x >1 其可以自减一,判断 x 能否变为 y 

只有 1 2 3 不可以变得越来越大,特判也可以 

int main()
{
    rush(){
        ll x,y;
        cin>>x>>y;
        if(y<=x) { puts("yes"); continue;  }
        bool flag=0;
        while(y>x){
            int tmp=x;
            if(tmp&1) tmp--;
            tmp=tmp/2*3;
            if(tmp>x) x=tmp;
            else{ flag=1; break; }
        }
        puts(flag?"no":"yes");
    }
    //PAUSE;
    return 0;
}

 C - Dominated Subarray

这个一开始读错题了,但发现这个题之前做过…… 

原文链接

 从n个数中找出一个字串,使得这个字串只有1个重复元素且重复次数为二,输出最短长度

const int N=2e5+5;

    int n,m,t;
    int i,j,k;
    int a[N];
    map<int,int>mp;//记录上一次 a[i] 出现的位置

int main()
{
    IOS; string s;
    rush(){
        int ans=inf;
        cin>>n; mp.clear();
        for(i=0;i<n;i++){
            cin>>a[i];
        }
        if(n==1){cout<<-1<<endl; continue;}
        for(i=0;i<n;i++){
            if(!mp.count(a[i]))
                mp[a[i]]=i;
            else {
                ans=min(ans,i-mp[a[i]]+1);
                mp[a[i]]=i;
            }
        }
        if(ans==inf) cout<<-1<<endl;
        else cout<<ans<<endl;
    }
    return 0;
}

------------------------------------------------------------------------思维分界线-------------------------------------------------------------------------- 

 D - Yet Another Monster Killing Problem(贪心+思维)

 

 

有n个怪兽 ,每个怪兽都有暴力值为 a[i]。

而幸好现在有m个英雄,每个英雄也有暴力值 p[i],此外英雄还有抗揍值 s[i],表示这个英雄一天最多打败 s[i] 个怪兽

我们只能消灭怪兽(one by one),不能改变顺序,输出最少多少天打败所有的怪兽。

这个题数组 s[i] 的范围为 [1,n] ,所以我们可以开一个数组 b[i] 代表抗揍值为 i 的英雄的最大暴力值,当然这些拥有最大暴力值英雄也可以压迫 [1,i] 只怪兽

因为英雄可以不按顺序出,所以只要满足抗揍区间 b[L,R]>a[i] ( L<=i<=R ) 

const int N=2e5+5;

    int n,m;
    double t; 
    int i,j,k;
    int a[N],b[N];
    int p[N],s[N];
int main()
{
    rush(){
        sd(n);
        for(i=1;i<=n;i++) b[i]=0,sd(a[i]);
        sd(m);
        for(i=1;i<=m;i++) sdd(p[i],s[i]),b[s[i]]=max(b[s[i]],p[i]);
        //cout<<*(a.begin()+2)<<endl;
        if( *max_element(a+1,a+1+n) > *max_element(p+1,p+1+m) ){ puts("-1"); continue; }
        for(i=n-1;i>=1;i--){//坚持的天数
            b[i]=max(b[i],b[i+1]);
        }
        int ans=0,cur=1;//耐力值的起点
        while(cur<=n){//寻找怪兽
            int tmp=cur;//耐力值的终点
            int maxx=0;
            while(true){
                maxx=max(maxx,a[tmp]);
                if(maxx>b[tmp-cur+1]) break;
                tmp++;
            }
            ans++;
            cur=tmp;
        }
        pd(ans);
    }
    //PAUSE;
    return 0;
}

E - The Contest 

a 数组有 k1 个数,b 数组有 k2 个数,c 数组有 k3 个数,每个数组都可以将自己的元素交出去,问最少要多少次使得 C>B>A(数组C内所有元素都大于另外的数组,数组 B 内所有元素都大于 A 的,当然数组可以为空) 

思路:先将原数组进行编号 A(1),B(2),C(3) ,保证 ABC 单调递增如果出现极值点,将极点归还给对应数组即可,例如入样例 13123 的情况下,因为将二号元素移动到数组 A 中,所以变为 11123 

const int N=2e5+5;

    int n,m;
    double t; 
    int i,j,k;
    int a[N],b[N];
int main()
{
    int k1,k2,k3,_;
    sddd(k1,k2,k3);
    for(i=1;i<=k1;i++){
        sd(_);
        a[_]=1;
    }
    for(i=1;i<=k2;i++){
        sd(_);
        a[_]=2;
    }
    for(i=1;i<=k3;i++){
        sd(_);
        a[_]=3;
    }
    int res=0;
    n=k1+k2+k3;
    for(i=1;i<=n;i++){
        if(res==0 || a[i]>=b[res-1]) b[res++]=a[i];
        else{
            int pos=upper_bound(b,b+res,a[i])-b;
            b[pos]=a[i];
        }
    }
    pd(n-res);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值