Codeforces Round #627 (Div. 3)(A--D)

    地址:http://codeforces.com/contest/1324

 

 

 

 

    题意:看着挺长的,实际上就这么些东西,俄罗斯方块。操作1:放2*1的块,随便无限放。操作2:非0集体减1。问最后是否能把方块全消除完。

      解析:找一个最高的maxx,看其他能否全部变成maxx,由于放的方法是每次+2,那么看每个方块与maxx的差值,偶数即可。全为偶数就是YES,否则NO。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e2+10;
int a[maxn];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        int maxx=-1;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
            if(a[i]>maxx)
                maxx=a[i];
        }
        int ok=0;
        for(int i=0;i<n;i++)
        {
            if(a[i]<maxx)
            {
                int mid=maxx-a[i];
                if(mid%2!=0)
                {
                    ok=1;break;
                }
            }
        }
        if(ok)
            cout<<"NO"<<endl;
        else
            cout<<"YES"<<endl;
    }
}

 

 

 

 

     题意:能否从已给的数组中找到一个子串而且是回文。注意这个子串中间的元素是可以不连续的,但要保证顺序。

     解析:题中说len>=3,那么就很简单了,我们只需要看Len==3的就可以了。因为对于len>3的任意回文串,里面一定存在一个len==3的回文子串(不一定连续)。len==3的回文串,a[1]一定==a[3],那么我们只需要两个for就可以了。对于当前的a[i],往后找到一个a[j]==a[i]而且,j!=i+1。即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=5e3+10;
int a[maxn];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        int ok=0;
        for(int i=0;i<n;i++)
        {
            for(int j=i+1;j<n;j++)
            {
                if(a[i]==a[j]&&j>i+1)
                {
                    ok=1;break;
                }
            }
        }
        if(ok)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;
    }
}

 

 

     题意:青蛙从0跳到n+1,到哪一格,就要执行当前格的方向跳,L就往左,R就往右。要求给出一个d,此为最长跳跃距离。找出最小的一个d来。而且保证一定能从0跳到n+1。

     解析:其实这个题不用管L的,只需要看R就好了,因为只有R才能保证到达终点呀。样例1是有点误导的意思。记下所有R的出现位置,找到它们所有的间距,输出最大的就好了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=2e5+10;
int a[maxn];
char s[maxn];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>s;
        int len=strlen(s);
        int l,r;
        int ok=0,ok2=0;
        int tot=0;
        for(int i=0;i<len;i++)
        {
            if(s[i]=='R')
            {
                ok=1;
                a[tot++]=i;
            }
            else
            {
                ok2=1;
            }
        }
        if(!ok)
        {
            cout<<len+1<<endl;continue;
        }
        int maxx=-1;
        for(int i=0;i<tot-1;i++)
        {
            int mid=a[i+1]-a[i];
            if(mid>maxx)
                maxx=mid;
        }
        int kk=max(a[0]+1,len-a[tot-1]);
        cout<<max(kk,maxx)<<endl;
    }
}

 

 

     题意:要求对于i<j,ai+aj>bi+bj,找出有几对。

     解析:  看这数据,暴力行不通的。我刚开始纠结于顺序i<j的问题,所以没有A出来。我们可以把这个式子变一下,ai-bi+aj-bj>0。即ci+cj>0。这不就和顺序没有关系了嘛。直接把每个a[i]-b[i]存一下,再二分查找就可以了。记得开LL。。O(n*logn)的复杂度

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
ll a[maxn];
ll b[maxn];
ll vis[maxn];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    for(int i=1;i<=n;i++)
        scanf("%lld",&b[i]);
    for(int i=1;i<=n;i++)
    {
        vis[i]=a[i]-b[i];
    }
    sort(vis+1,vis+n+1);
    ll l=1,r=n;
    ll sum=0;
    while(l<r)
    {
        if(vis[l]+vis[r]>0)
        {
            sum+=r-l;
            r--;
        }
        else
            l++;
    }
    cout<<sum<<endl;
}

 

posted @ 2020-03-13 17:41  liyexin  阅读(234)  评论(0编辑  收藏  举报