Codeforces Round #627 (Div. 3)

A. Yet Another Tetris Problem

题意:俄罗斯方块 给你每一列的高度 每次只能竖着放尺寸2*1的长方形,问是否能全部消除

#include <iostream>
#include <algorithm>
using namespace std;
const int N=110;
int a[N];
int t,n;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        bool flag=true;
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        sort(a+1,a+1+n);
        for(int i=n;i>=1;i--)
        for(int j=i;j>=1;j--)
        {
            if((a[i]-a[j])%2!=0)
            {
                flag=false;
                break;
            }
        }
        if(flag)
        printf("YES\n");
        else
        printf("NO\n");
    }
}
View Code

B. Yet Another Palindrome Problem

题意:找长度为3的回文串  只要找到两个不相邻的数相等就满足题意

#include <iostream>
#include <algorithm>
using namespace std;
const int N=5010;
int a[N];
int t,n;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        bool flag=false;
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        
        for(int i=1;i<=n;i++)
        for(int j=n;j>=i+2;j--)
        {
            if(a[i]==a[j])
            {
                flag=true;
                break;
            }
        }
        if(flag)
        printf("YES\n");
        else
        printf("NO\n");
    }
}
View Code

C. Frog Jumps

题意:给一个字符串长度为n里面有'L' 'R' 分别可以向左或者向右移动d长度 在可以跳到终点n+1的情况下,问d最小是多长。

分析:即求两个 ‘R’之间和最后一个‘R'和终点距离的最大值

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=200100;
char s[N];
int t;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        int x=0,res=0;
        scanf("%s",s+1);
        int len=strlen(s+1);
        for(int i=1;i<=len;i++)
        {
            if(s[i]=='R')
            {
                res=max(res,i-x);
                x=i;
            }
            
        }
        res=max(res,len+1-x);
        printf("%d\n",res);
    }
}
View Code

D. Pair of Topics

题意 给两个长度为n的a,b数组,求满足  ai+aj>bi+bj (i<j)的i和j的对数

分析:移向   ai-bi+aj-bj>0 另a-b=c  即满足  ci+cj>0 的对数

故构造c数组 排序 二分或者双指针算出结果

#include <iostream>
#include <algorithm>
using namespace std;
const int N=200100;
int a[N],b[N],q[N];
long long n,ans;
int main()
{
    scanf("%lld",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    for(int i=1;i<=n;i++) scanf("%d",&b[i]);
     for(int i=1;i<=n;i++) q[i]=a[i]-b[i];
     sort(q+1,q+1+n);
         int l=1,r=n;
         while(l<r)
         {
             if(q[l]+q[r]>0) 
             {
                 ans+=r-l;
                 r--;
             }
             else l++; 
         }
         printf("%lld\n",ans);
     
}
View Code

 

posted @ 2020-03-13 11:01  地球长大的赛亚人  阅读(231)  评论(0编辑  收藏  举报