div4 题解

前言:说实话codeforce不挂VPN是真的绝望,我是当时被人拎去在比赛时间做的,然后那吃屎的速度硬是只让我A了前5T,反正写题半小时等待半小时。

在这里插入图片描述
A. Sum of Round Numbers
题意:给出n个数,输出每个数有几位不是0,然后下一行输出分解后的数
1111->输出 4
1000 100 10 1

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;++i)
	{
		int a,ans[6],cnt=0,t=1; //因为数据最大为1e4,所以ans开到6足够
		cin>>a;
	    while(a)   //a为0说明分解完毕
	    {
	    	if(a%10==0)t*=10;
	    	else {ans[++cnt]=(a%10)*t;t*=10;}
	    	a/=10;
		}
		cout<<cnt<<endl;
		for(int i=1;i<=cnt;++i)
		{
			cout<<ans[i]<<" ";
		}
		cout<<endl;
	}
}

B. Same Parity Summands
题意:共 t组数据,每组给一个n一个k,把n拆成k个同奇或同偶的数
思路:偶数就k-1个为2,剩下的为n-2*(k-1),奇数就全为1,剩下的为n-k。
然后考虑可行和不可行的所有情况。

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		int m,k;
		cin>>m>>k;
		if(m%2==1&&k%2==0){cout<<"NO"<<endl;continue;}
		if(m%2==0&&k%2==1&&m<k*2){cout<<"NO"<<endl;continue;}
		if(k%2==0&&m<k){cout<<"NO"<<endl;continue;}
		if(m%2==1&&k>m){cout<<"NO"<<endl;continue;}
		cout<<"YES"<<endl;
		if(k%2==1&&m%2==0){
			while(k!=1){
				cout<<2<<" ";
				m-=2;
				k--;
			}
			cout<<m<<endl;
			continue;
		}
		else if(k%2==0&&m%2==0){
			while(k!=1){
				cout<<1<<" ";
				m--;
				k--; 
			}
			cout<<m<<endl;
			continue;
		}
		if(m%2==1&&k%2==1){
			while(k!=1)
			{
				cout<<1<<" ";
				k--;
				m--;
			}
			cout<<m<<endl;
		}
	}
}

C. K-th Not Divisible by n(沙雕题,连水题都不配)
题意:t组数据,每组给出n和k,求第k个不能被n整除的数
思路;一个n为1环,每环满足条件的数有n-1个,所以用sum=n*k/(n-1),
如果k被(n-1)整除,就sum-1,不然就加上k%(n-1)

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		int a,b,sum=0;
		cin>>a>>b;
		sum=b/(a-1)*a;
		if(b%(a-1)==0)sum-=1;
		else sum+=b%(a-1);
		cout<<sum<<endl;
	}
}

D. Alice, Bob and Candies
没啥好说的deque还不会用的拖出去打死

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		int t,s1=0,s2=0,next=0,cnt=1;
		deque<int> p;
		cin>>t;
		for(int i=1;i<=t;++i)
		{
			int a;
			cin>>a;
			p.push_back(a);
		}
		next=p.front();
		p.pop_front();
		s1+=next;
		while(!p.empty())
		{
			int sum=0;
			++cnt;
			if(cnt%2==1){
				while(sum<=next&&!p.empty())
				{
					sum+=p.front();
					p.pop_front();
			    }
			    next=sum;
				s1+=sum;
				continue;
			}
			else{
				while(sum<=next&&!p.empty())
				{
					sum+=p.back();
					p.pop_back();
			    }
			    next=sum;
				s2+=sum;
				continue;
			}
		}
		cout<<cnt<<" "<<s1<<" "<<s2<<endl;
	}
}

E. Special Elements
题意:能不写吗 求n个数的数列中有几个数可以用连续子区间的和表示。(讲道理这个数据量,摆明了一副快来大力上我的意思
思路:前缀和优化使查找区间和的时复为O(1),桶排使查找同样的数的时复为O(1),然后逐渐增大区间,遍历。

#include<bits/stdc++.h>
using namespace std;
int max(int a,int b)
{
	if(a>b)return a;
	return b;
}
int main(){
	int n;
	cin>>n;
	while(n--){
		int a[8006]={0},s[8006]={0},sum[8006]={0},mx=0,cnt=0;
		int m;
		cin>>m;
		for(int i=1;i<=m;++i)
		{
			int a;
			cin>>a;
			s[a]++;
			mx=max(mx,a);
			sum[i]=sum[i-1]+a;
		}
		int l=2;
		while(l<m)
		{
			for(int i=l;i<=m;++i)
			{
				int b=sum[i]-sum[i-l];
				if(b<=mx)a[b]=1;
			}
			l++;
		}
		for(int i=2;i<=mx;++i){
			if(a[i])cnt+=s[i];
		}
		cout<<cnt<<endl;
	}
}

F. Binary String Reconstruction
题意:t组数据,每组给3个数n0,n1,n2,代表‘00’ ‘01’ ‘11’的字符个数
思路:(这道题我一开始抽风了,硬着头皮按先‘00’后‘01’再‘11’构造,然后我就烂了,wa了n发 )先构造00和11,如果n0和n2均不为0,n1-1,然后n1看前面的数是0还是1选择输出,如果没有数,那就自己造自己就完事

#include<bits/stdc++.h>
#define ll long long int
using namespace std;
int main(){
	int n;
	cin>>n;
	while(n--)
	{
		int a,b,c;
		cin>>a>>b>>c;
		if(c)
		{
			for(int i=1;i<=c+1;++i)
			{
				cout<<1;
			}
		}
		if(a)
		{
		for(int j=1;j<=a+1;++j)
		{
			cout<<0;
		}
		}
		if(a&&c)b--;
		if(a==0&&c)
		{
			for(int i=1;i<=b;++i)
			{
				cout<<(i%2==1?0:1);
			}
		}
		if(a){
			for(int i=1;i<=b;++i)
			{
				cout<<(i%2==1?1:0);
			}
		}
		if(a==0&&c==0)
		{
			cout<<1;
			for(int i=1;i<=b;++i)
			{
				cout<<(i%2==1?0:1);
			}
		}
		cout<<endl;
	}
}

G. Special Permutation
题意:输入n,将1到n排列,相邻数据之差为2到4
思路:奇数偶数分开排,然后其中一个队列按降序排列,我是偶数在前,
最后2和4换个位置,同理可得如果n<4,则不存在

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		int a,b;
		cin>>a;
		if(a<4){cout<<-1<<endl;continue;}
		b=a;
		if(a%2==1)b=a-1;
		while(b>4)
		{
			cout<<b<<" ";
			b-=2;
		}
		if(b>4){cout<<2;cout<<" "<<4;}
		else cout<<2<<" "<<4;
		for(int i=1;i<=a;i+=2)
		{
			cout<<" "<<i;
		}
		cout<<endl;
	}
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值