其他分享
首页 > 其他分享> > Codeforces Round #627 (Div. 3)——ABCD题

Codeforces Round #627 (Div. 3)——ABCD题

作者:互联网

本蒟蒻的第一篇cf解题报告

在这里插入图片描述

题意:
1X1的方块,每一列有不同数量的方块,可以用任意数量的长度为2X1的方块,能否将每一列都变成数量相同;
可以发现进行填充之后每一列都要和最高的那一列同高 可以先找到最大值,如果每一列都要达到最大值数量的方块,就要求每一类和最大值的差值都是2的倍数,如果有一列不是,就不可以达到目标

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
const int inf=0x3f3f3f3f; 
int a[maxn];
int main()
{
	int T,n,maxs;
	cin>>T;
	while(T--)
	{
		scanf("%d",&n);
		maxs=-inf;
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
			maxs=max(maxs,a[i]);
		}
		int flag=1;
		for(int i=1;i<=n;i++)
		{
			if((maxs-a[i])%2==1)
				flag=0;
		}
		if(flag)
			cout<<"YES"<<endl;
		else 
			cout<<"NO"<<endl;
	}
}

在这里插入图片描述
题意:在一个序列里是否有长度大于3的回文子串。

1 如果每个元素只出现一次无论怎样也不可能构成回文串;

2 如果一个数出现了3次或者以上,求可以单用这三个数组成一个回文字串,不论位置;

3 如果一个元素出现了两次,如果这两次不是连续出现的,那么就可以通过这两个元素和中间的任意一个元素构成一个回文串

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<stack>
#include<map>
using namespace std;
const int maxn=1e6+5;
#define ll long long
inline int read()
{
    int x=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s<='9'&&s>='0'){x=x*10+s-'0';s=getchar();}
    return x*f;
}
int a[maxn];
map<int ,int >mp;
int main()
{
	int T,n;
	cin>>T;
	while(T--)
	{
		int flag=0;
		cin>>n;
		for(int i=1;i<=n;i++)
			a[i]=read();
		for(int i=1;i<=n;i++)
		{
			mp[a[i]]++;
			if(mp[a[i]]==2)
			{
				if(a[i-1]!=a[i])
					flag=1;
			}
			if(mp[a[i]]>2)
				flag=1;
		}
		if(flag)
			printf("YES\n");
		else 
			printf("NO\n");	
		mp.clear();
	}
}

在这里插入图片描述

题意:由L和R组成的序列每个代表1个单位,L可以向左走,R可以向右走,每次最多可以走d个单位u,问走0开始走到字符串最后,最大一次跨越距离d的最小值;
看到最大距离的最小化,首先想到了二分
可以考虑,想要走到最后,中间的L必须要全部跨过去,因为到了L就必须向左走,必须要跨越一段L,才能走到最后;
所以只需要把最长连续的一段L求出来即可

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<stack>
#include<map>
using namespace std;
const int maxn=1e6+5;
const int inf=0x3f3f3f3f;
#define ll long long
inline int read()
{
    int x=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s<='9'&&s>='0'){x=x*10+s-'0';s=getchar();}
    return x*f;
}
char a[maxn];
int main()
{
	int T;
	cin>>T;
	getchar();
	while(T--)
	{
		scanf("%s",a);
		int len=strlen(a);
		//cout<<len<<endl;
		int ans=1;
		int t=1;
		int maxs=-inf;
		for(int i=0;i<len;i++)
		{
			if(a[i]=='L')
				t++;
			else 
			{
				maxs=max(maxs,t);
				t=1;
			}
		}
		maxs=max(maxs,t);
		printf("%d\n",maxs);
	}
}

在这里插入图片描述
计算ai+aj>bi+bj;就是ai-bi+aj-bj>0
计算c[i]=a[i]-b[i],然后对c[i]进行排序,如果满足上述条件的话,应该有c[i]+c[j]=a[i]-b[i]+a[j]-b[j]>0。用两个指针l和r计算配对数即可。
本来觉得i<j有顺序的,后来发现并不是,当场暴毙

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
#include<stack>
#include<map>
using namespace std;
const int maxn=1e6+5;
const int inf=0x3f3f3f3f;
#define ll long long
inline int read()
{
    int x=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s<='9'&&s>='0'){x=x*10+s-'0';s=getchar();}
    return x*f;
}
ll a[maxn],b[maxn],c[maxn];
int main()
{
	ll n;
    cin>>n;
    for(int i=1;i<=n;i++)
    	a[i]=read();
    for(int i=1;i<=n;i++)
    	b[i]=read();
    for(int i=1;i<=n;i++)
        c[i]=a[i]-b[i];
    sort(c+1,c+1+n);
    int l=1,r=n;
	ll ans=0;
    while(l!=r)
    {
        if(c[l]+c[r]>0)
        {
            ans+=r-l;
            r--;
        }
        else
            l++;
        
    }
    cout<<ans<<endl;
    return 0;
}

标签:ABCD,627,int,while,maxn,const,Div,include,getchar
来源: https://blog.csdn.net/beiweiyi/article/details/104837856