zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    C#访问MySql连接字符串
    简单的async和await用法
    Nuget新旧地址更换
    【NPS】nps分多少算好
    「干货」什么Linux是邮件服务器?
    「干货」编程语言十大经典算法,你知道几个?
    实验干货分享:用Go语言实现分布式缓存开发之map
    开发微信小程序游戏真的有手就行吗?
    图数据库Neo4j的介绍与使用
    干货分享:什么是Java设计三大工厂模式?
  • 原文地址:https://www.cnblogs.com/liyexin/p/12487858.html
Copyright © 2011-2022 走看看