A. Regular Bracket Sequences
找规律。
#include<iostream>
using namespace std;
char a[150];
bool b[150];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int j=i,k=i,l=n-i;
while(j--)cout<<"(";
while(k--)cout<<")";
while(l--)cout<<"()";
cout<<endl;
}
}
return 0;
}
B. Combinatorics Homework
就是找相邻两个相等的情况的最大值和最小值,如果m在这之间就为YES,否则为NO。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int m;
int s=0;
int a,b,c;
cin>>a>>b>>c>>m;
int maxn=max(max(a,b),c);
int minn=min(min(a,b),c);
int xx=maxn-minn-(a+b+c-maxn-minn)-1;
int y=a+b+c-3;
if(m<=y&&m>=xx)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
C. Slay the Dragon
分情况讨论+二分;
二分找到大于等于x的第一个数l1和小于等于x的第一个数l2;
有两种情况:1.x+y>=数组a的总和sum
2.x+y<sum;
根据这两种情况再细分l1<=x和l2>=x和l2<x<l1的情况。
#include<iostream>
#include<algorithm>
using namespace std;
const int N=2e5+10;
typedef long long ll;
ll a[N];
int main()
{
int n;
cin>>n;
ll sum=0;
for(int i=0;i<n;i++)cin>>a[i],sum+=a[i];
ll m;
cin>>m;
sort(a,a+n);
while(m--)
{
ll x,y;
cin>>x>>y;
ll res=0;
ll l1=0,r1=n-1;
while(l1<r1)
{
ll mid=(l1+r1)/2;
if(x<=a[mid])r1=mid;
else l1=mid+1;
}
ll l2=0,r2=n-1;
while(l2<r2)
{
ll mid=(l2+r2+1)/2;
if(x>=a[mid])l2=mid;
else r2=mid-1;
}
if(sum>=(x+y))
{
if(a[l2]>=x)cout<<max(y-sum+a[l2],0ll)<<endl;
else if(a[l1]<=x)cout<<x-a[l1]<<endl;
else cout<<min(max(y-sum+a[l1],0ll),x-a[l2])<<endl;
}
else
{
if(a[l2]>=x)cout<<y-sum+a[l2]<<endl;
else if(a[l1]<=x)cout<<max(x+y-sum,x-a[l1])<<endl;
else cout<<min(max(x+y-sum,x-a[l2]),y-sum+a[l1])<<endl;
}
}
return 0;
}