Codeforces Round #652 (Div. 2)ABCD题解

A. FashionabLee

传送门
题意:判断n多边形是否同时有平行于x轴和y轴的边;
题解:不难发现4*k=n的多边形都满足,其余均不满足;

#include
#include
#include
using namespace std;
int main()
{
	int t,n;
	cin>>t;
	while(t--){
		cin>>n;
		if(n%4==0) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
}

B. AccurateLee

传送门
题意:一个二进制的字符串,现在你可以将10的子串删除其中任意一个,使得最后剩下的字符个数最少,且最小(如果我们有两个字符串x和y同样的长度x在字典上比y如果有职位i使.x1=y1, x2=y2,…, xi−1=yi−1和xi 题解:从题中不难看出字符串首的0删不掉,字符串尾的1删不掉,中间的如果存在1在前0在后的情况,可以全部删除剩下一个,因为要最小,所以剩下来的一定是0。
所以我们可以分别从后往前遍历遇到0就停下来,再从前往后遍历遇到1就停下来最后得到的结果为答案的倒序。

#include
#include
#include
using namespace std;
string s;
int main()
{
	int t,n;
	cin>>t;
	while(t--){
		cin>>n>>s;
		int p=1;
		string ans;
		for(int i=s.size()-1;i>=0;i--)
		if(s[i]=='0'){	ans+="0";
		p=i;
		break;	} 
		//从后往前遍历遇到0退出
		else if(s[i]=='1') ans+="1";
		for(int i=0;i<p;i++)
		if(s[i]=='0') ans+="0";
		else break;
		//从前往后遍历遇到1退出
		for(int i=ans.size()-1;i>=0;i--) cout<<ans[i];
		//倒序输出答案
		cout<<endl;
	}
	return 0;
}

C.Rational Lee

传送门
题意:有n个整数,k个人,每个人需要得到几个整数已确定,现在要把n个整数按照要求全部分给k个人,然后计算k个人的总幸福值(每个人得到的最大整数与最小整数之和为他的幸福值)
题解:首先把k个最大值按照k个要求从大到小分配给k个从小到大的需求个数的人手中;然后再把剩下的整数按照同样的方法分配给每个人即可

#include
#include
#include
using namespace std;
const int N=200010;
int t,n,k;
int a[N],w[N],s[N];
long long int sum=0;
int main()
{
	scanf("%d",&t);
	while(t--){
		memset(s,0,sizeof s);
		sum=0;
		scanf("%d%d",&n,&k);
		for(int i=0;i<n;i++) scanf("%d",&a[i]);
		for(int i=0;i<k;i++) {
			scanf("%d",&w[i]);
			w[i]--;
			//先给每一个人分配了一个最大值,所以减1
		}
		sort(a,a+n);//给整数排序
		sort(w,w+k);//给k个要求排序
		int z=0,i=n-1;
	for(i;i>=0;i--) if(z<k) s[z++]=a[i];
	//先把最大值分配出去
	i=n-z-1;//记录剩下的最大值下标
	for(int j=0;j<k;j++) {
		if(w[j]==0) s[j]+=s[j];
		//如果为0则说明最大值最小值都是自己
	  else {
	   	i=i-w[j];
	   	s[j]+=a[i+1];
		}
		//分配w[j]个剩余最大整数给他,并加上最小值
	}
		for(int i=0;i<k;i++)  sum+=s[i];
		//把所有人的幸福值相加
		cout<<sum<<endl;
	}
	return 0;
}

D.TediousLee

传送门
找规律即可,上代码

#include
using namespace std;
#define N 2000005
#define ll long long
#define mod 1000000007
int i,T,n,x;ll ans[N];
int main(){
	cin>>T;
	ans[3]=ans[4]=4;
	for(i=5;i<N;++i){
		ans[i]=ans[i-1]+ans[i-2]*2+(i%3==0)*4;ans[i]%=mod;
	}
	while(T--){
		cin>>x;cout<<ans[x]<<"\n";
	}
	}

你可能感兴趣的:(笔记)