前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Codeforces Round #627 (Div. 3) 题解

Codeforces Round #627 (Div. 3) 题解

作者头像
杨鹏伟
发布2020-09-11 15:10:14
2270
发布2020-09-11 15:10:14
举报
文章被收录于专栏:ypwypw

A.Yet Another Tetris Problem 题意:看白了其实就是让你看看是否都为偶数,或者奇数,是的话输出YES,否则输出NO。

代码语言:javascript
复制
#include<bits/stdc++.h>

using namespace std;

int a[105];

int main(){
	int t;
	cin>>t;
	while(t--){
		int n;
		cin>>n;
		int flag = 0;
		for(int i=1;i<=n;i++){
			cin>>a[i];
			if(a[i] % 2 == 0) flag++;
		}
		if(flag == n||flag ==0) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
} 

B.Yet Another Palindrome Problem 题意:就是判断是否有至少三个数以上的子数组满足回文串问题。

思路:只要找到两个相同的数,并且之间的距离是大于1,及还能放一个数以上的数,那么就可以找到至少为3的子数组满足题目要求。

代码语言:javascript
复制
#include<bits/stdc++.h>
#define maxn 6005
using namespace std;

int t;
int n;
int a[maxn];
bool  flag;
		
int main(){
	cin>>t;
	while(t--){
		flag =0; 
		cin>>n;
		for(int i=0;i<n;i++)
			cin>>a[i];
			
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                if(a[j]==a[i]&&j-i>=2){
                    flag=1;
                    break;
                }
            }
            if(flag)  break;
        }


		if(flag) 
		cout<<"YES"<<endl;
		else 
		cout<<"NO"<<endl;
	}
	return 0;
 }

C.其实结合样例看比较好懂一些。就是求相邻R之间得最大距离,其中把开头跟n+1,也当作是R,那么小青蛙就是能一直跳。跳到最后。

代码语言:javascript
复制
#include<bits/stdc++.h>
using namespace std;

string s;
int main(){
    int t;
	cin>>t;
	while(t--)
	{
		cin>>s;
		int res=0,ans=0;
		for(int i=0;i<s.size();i++)
			if(s[i]=='R')
			{
				ans=max(i+1-res,ans);
				res=i+1;
			}
		ans=max(ans,s.size()1-res);
		cout<<ans<<endl;;
	}
	return 0;
 }

D.Pair of Topics 题意:就是对公式进行变形,然后用二分减少复杂度就行了

一开始想了个O(n*n)复杂度得,明知道过不去,却还是试了试。然后就超时卡12了。

代码如下:

代码语言:javascript
复制
#include<bits/stdc++.h>
#define maxn 200005 
using namespace std;
typedef long long ll;

ll a[maxn],b[maxn];
ll c[maxn];
ll d[maxn];


int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	 cin>>a[i];
	for(int i=1;i<=n;i++) 
	 cin>>b[i];
	for(int i=1;i<=n;i++){
		c[i] = a[i]-b[i];
		d[i] = b[i]-a[i];
	}
	int ans = 0;
	for(int i=2;i<=n;i++){
		for(int j=1;j<i;j++){
			if(c[i] > d[j])
			 ans++;
		}
	}
	cout<<ans<<endl;
	return 0;
}

其实之前做过ICPC沈阳A题跟这个十分相似,但是这个是在那个签到提得基础上又稍微增加了点难度,算了,我不配说这话,还是太菜了。

AC代码 思路:就是我们如果变形一下得话就会变成ai-bi>bj-aj;那么首先我们先求得ai-bi得差给存起来,然后得话我们给其进行排序,然后一个for循环,找到第一个大于当前得bj-aj得位置,那么后面得肯定都大于,然后就这样就行了。

代码语言:javascript
复制
#include<bits/stdc++.h>
#define maxn 200005 
using namespace std;
typedef long long ll;

ll a[maxn],b[maxn];
ll c[maxn];
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	 cin>>a[i];
	for(int i=1;i<=n;i++)
	 cin>>b[i];
	for(int i=1;i<=n;i++)
	 c[i] = a[i] - b[i];
	sort(c+1,c+n+1);
	ll ans = 0;
	for(int i=1;i<=n;i++){
		ll res = b[i]-a[i];
		ans += (c+n+1)-upper_bound(c+1,c+n+1,res);
		if(res<0) ans--;
		//cout<<ans<<endl;
 	}
 	cout<<ans/2<<endl;
} 
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档