Educational Codeforces Round 76 (Rated for Div. 2)

A. Two Rival Students 

题目大意为:给定一个长度为n的序列并指定a元素b元素再在序列里的位置,你可以操作x次,求操作完成后a和b的最大距离

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int t,n,x,a,b;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d%d",&n,&x,&a,&b);
        printf("%d\n",min(n-1,x+abs(b-a)));
    }
}
View Code

B. Magic Stick

题目大意:给定两个数a和b并定义两个操作。操作一:如果a>1,那么a就可以不断-1 操作二:如果a是偶数,则可以变成二分之三a 问a经过任意顺序任意次数操作和可否变成b

分析:由于a和b都是大于1的正整数 故当a>=b时 不操作或通过不断-1操作最终可以变为b。当a<b时 若a>=4那他就可以不断乘二分之三完成倍增或先减去1再进行倍增最终与b相等。

当a=2时乘上二分之三是3无法倍增,减1倍增后发现始终循环,故需要特判。

#include <iostream>
#include <algorithm>
using namespace std;
int t;
int  a,b;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&a,&b);
        if(a>=b)
        printf("YES\n");
        else if(a<b&&a>=4)
        printf("YES\n");
        else if(a==2&&b==3)
        printf("YES\n");
        else printf("NO\n");
        
    }
}
View Code

C. Dominated Subarray

题意:求一段最小的子区间使得只有一个数的个数为2

#include <iostream>
#include <algorithm>
#include <cstring>
#include <set>
using namespace std;
const int N=200100,INF=0x3f3f3f3f;
int a[N];
set<int>s;
int n,ans;
int pos[N];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
            s.clear();
            memset(pos,0,sizeof(pos));
            cin>>n;
            for(int i=1;i<=n;i++)
            cin>>a[i];
            ans=INF;
            for(int i=1;i<=n;i++)
            {
                    if(s.count(a[i])==1)
                    {
                        ans=min(ans,i-pos[a[i]]+1);
                        pos[a[i]]=i;
                        continue;
                    }
                    s.insert(a[i]);
                    pos[a[i]]=i;
            }
            if(ans==INF)
            cout<<-1<<endl;
            else
            cout<<ans<<endl;
    }
}
View Code

 

posted @ 2020-03-05 16:35  地球长大的赛亚人  阅读(97)  评论(0编辑  收藏  举报