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的序列
转换方法为
但是只能操作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