A. Regular Bracket Sequences
题意:构造并输出n个长度为2n的正则括号序列。
即构造并输出n个长度为2n的合法括号序列。
题解:
直接生成即可,具体见代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
int t;cin>>t;
while(t--){
int n;cin>>n;
for(int k=0;k<n;k++){
for(int i=0;i<k;i++)
cout<<"()";
for(int i=k;i<n;i++)
cout<<"(";
for(int i=k;i<n;i++)
cout<<")";
cout<<endl;
}
B. Combinatorics Homework
题意:
给出四个数,a,b,c,n,分别代表,A、B、C的数量,和有n个相邻的数。
题解:
根据题目所给的a,b,c的数目,算出可表达的n的范围。
最多的:mmax=a+b+c+1;
最少的:
固定两个少的,在最前面的位置和它们之间的位置插入剩下那个的位置。剩余的则全部放到最后的位置。
则可产生最少的对数。
即:最大-(另两个的和)-1【需要保证大于等于0的】
举个例子:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
int t;cin>>t;
int now=1;
while(t--){
int n;
int a[3];cin>>a[0]>>a[1]>>a[2];
cin>>n;
sort(a,a+3);
int mmax=a[0]+a[1]+a[2]-3;
int mmin=max(0,a[2]-a[1]-a[0]-1);
if(n>=mmin&&n<=mmax)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
C. Slay the Dragon
题意:
给出n个勇士,m个恶龙。
抗击恶龙,需要条件:1>一个勇士的能力大于等于xi,剩下勇士的能力之和大于等于yi。
一个金币可以使一个勇士的能力加1。求打败所有的恶龙使用的能力数。打败每组恶龙修改的书数值不相关。
题解:
想要打败一个恶龙,我们应该找出所派出的那个勇士的最优值。
找出离恶龙的最近的上下两个数求最小值就好啦。
本题应该使用二分,不然会超时,排序后借助函数即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=2e5+3;
ll a[maxn];
ll x,y;
int main(){
int n;cin>>n;
ll sum=0;
for(int i=0;i<n;i++){
scanf("%lld",&a[i]);
sum+=a[i];
}
sort(a,a+n);
int m;cin>>m;
while(m--){
cin>>x>>y;
int i=lower_bound(a,a+n,x)-a;//该函数利用了二分
if(x==a[i]){
if(sum-x>=y)printf("0\n");
else printf("%lld\n",y-sum+x);
}
else if(i<n)//存在比它大的
{
if(i==0)//特殊情况
{
if(sum-a[i]>=y) printf("0\n");
else printf("%lld\n",y-sum+a[i]);
}
else
{ ll ans1=y-sum+a[i];//用大值
ll ans2=sum-a[i-1]>=y?x-a[i-1]:x+y-sum;//小值
if(sum-a[i]>=y) printf("0\n");
else printf("%lld\n",min(ans1,ans2));
}
}
else {
i=n;
ll ans2=sum-a[i-1]>=y?x-a[i-1]:x+y-sum;//小值
printf("%lld\n",ans2);
}
}