(Training 1) Educational Codeforces Round 101

A. Regular Bracket Sequence

题意:给你一段字符串 只有’(’ 、’)’、 ‘?’ ‘?‘能变成’(’ 或’)’
只存在一个’(‘和一个’)’ 能否完成括号匹配
那么只需要判断s[0]和s[s.size()]即可 比赛时没有看懂题目

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		string a;
		cin>>a;
		int flag=1;
		if(a[0]==')'||a[a.size()-1]=='(')flag=0;
		if(a.size()&1)flag=0;
		if(flag)puts("YES");
		else puts("NO");
	}
}

B. Red and Blue

题意:给你2个数组 a和b 能交叉组合成一个数组r 顺序随便 但是a b的顺序不能改变 大小均为100
问你f(a)=max(0,a1,(a1+a2),(a1+a2+a3),…,(a1+a2+a3+⋯+an+m)) 最大为多少
暴力即可 但是比赛居然暴力写错了我怎么会这么菜了啊

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int a[N],b[N],sum1[N],sum2[N];
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		int n,m;
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
		scanf("%d",&m);
		for(int i=1;i<=m;i++)
		scanf("%d",&b[i]);
		memset(sum1,0,sizeof sum1);
		memset(sum2,0,sizeof sum2);
		int maxn=0,maxa=0,maxb=0,sum1=0,sum2=0;
		for(int i=1;i<=n;i++){
			sum1+=a[i];
			maxa=max(maxa,sum1);
		}
			
		for(int j=1;j<=m;j++){
			sum2+=b[j];
			maxb=max(maxb,sum2); 
		}
		cout<<maxa+maxb<<endl;
	}
	
}

C. Building a Fence

题意 :
在这里插入图片描述
长度为n的土地 给出每个土地的高度 篱笆的高度k
问是否能满足 相邻的篱笆相接最少不少于1
最高的篱笆不能超过土地的高度 边界篱笆必须刚好在土地上

分析:一个篱笆要符合要求 那么他能满足要求的时候
他最大能安篱笆的高度为前面篱笆的高度h+k-1
最小安插篱笆的高度为h-k+1
但是同时必须要满足不低于这块土地的高度h 和不高于h-k+1
然后就是一个dp递推 但是我们可以直接递推

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		int n,k;
		scanf("%d%d",&n,&k);
		int l=0,r=1e9,flag=1,h;
		for(int i=1;i<=n;i++){
			scanf("%d",&h);
			if(i==1){
				l=r=h;
			}
			else{
				l=max(l-k+1,h);
				r=min(r+k-1,h+k-1);
			}
			if(l>r)flag=0;
			if(i==n&&(l>h||r<h))flag=0;
		}
		if(flag)puts("YES");
		else puts("NO");
	}
    return 0;
	
}

D. Ceil Divisions

一个构造题
题意:将 1-n的序列转换为只有一个2 别的全是1的序列
转换方法为 a_x = \left\lceil \frac{a_x}{a_y} \right\rceil
但是只能操作n+5次
思路:一个x数操作x x+1一次会变为1 操作 x ceil(sqrt(x)) 2次会变为 1
最后我们留下2仍然是2即可

#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
const int N=1e5+10;
vector<pair<int,int>>ans;
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		int n;
		scanf("%d",&n);
		ans.clear();
		while(n>2){
			int s=ceil(sqrt(n));
			for(int i=s+1;i<n;i++){
				ans.push_back({i,i+1});
			}
			ans.push_back({n,s});
			ans.push_back({n,s});
			n=s;
		}
		printf("%d\n",ans.size());
		for(pair<int,int> x:ans){
			printf("%d %d\n",x.first,x.second);
		}
	}
} 

学算法有史以来第一次爆0 所以要多打比赛
所以接下来的的训练计划也有了 每天一场div2重现
Froggy说提升最好的办法就是每场div2都要补
那么这一篇就是就是第一篇总结博客Training 1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值