Codeforces Round #640 (Div. 4)

A 输出非零位

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;
int t,n,m;
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n;
		vector<int> ve;
		int cnt=0;
		while(n)
		{
			if(n%10) ve.push_back((n%10)*pow(10,cnt));
			cnt++;
			n/=10;	
		}	
		cout<<ve.size()<<endl;
		for(auto i:ve)
			cout<<i<<' ';
		puts("");
	}	
	return 0;
}

B 全是奇数时,前k-1个都为1,判断最后一个是否为奇数;
全是偶数时,前k-1个都是2,判断最后一个是否为偶数;(最后一个数大于0)

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;
int t,n,m;
 
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		if(m>n) puts("NO");
		else if((n-m+1)&1)
		{
			puts("YES");
			for(int i=0;i<m-1;i++) cout<<1<<' ';
			cout<<n-m+1<<endl;
		}
		else if((n-m*2+2)>0&&(n-m*2+2)%2==0)
		{
			puts("YES");
			for(int i=0;i<m-1;i++) cout<<2<<' ';
			cout<<n-m*2+2<<endl;
		}
		else puts("NO");
	}	
	return 0;
}

C 除了n的倍数其余全都是。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;
int t,n,k;
 
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n>>k;
		ll x=(k+n-2)/(n-1)-1;
		cout<<1ll*x*n+(k-x*(n-1))<<endl;
	}	
	return 0;
}

D 双指针扫一遍即可。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;
int t,n,k;
int s[N];
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		for(int i=0;i<n;i++) scanf("%d",s+i);
		int l=0,r=n-1,cnt=0;
		int a=0,b=0,sum1=0,sum2=0;
		while(l<=r)
		{
			int res=0;
			if(cnt&1)
			{
				while(res<=sum1&&l<=r)
					res+=s[r--];
				sum2=res;
				b+=res;
			}
			else
			{
				while(res<=sum2&&l<=r)
					res+=s[l++];
				sum1=res;
				a+=res;
			}
			cnt++;
		}
		printf("%d %d %d\n",cnt,a,b);
	}	
	return 0;
}

E n的总合不超过8000,O(n^2)就可以了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=8010;
int t,n,k;
int s[N],b[N];//b[i]表示i的个数
//int f[N][N],f[i][j]表示以第一个数为右端点长度为j的区间和,会超内存
int f[2][N];//f[i][]只与f[i-1][]有关,滚动数组优化省内存,其实前缀和更简单
bool st[N];
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		for(int i=0;i<=n;i++) b[i]=0,st[i]=0;
		for(int i=1;i<=n;i++) scanf("%d",s+i),b[s[i]]++;
		int cnt=0;
		f[1][1]=s[1];
		for(int i=2;i<=n;i++) 
		{
			f[i&1][1]=s[i];
			for(int j=2;j<=i;j++)
			{
				int num=f[i&1][j]=f[i-1&1][j-1]+s[i];
				if(num<=n&&!st[num])
				{
					cnt+=b[num];
					st[num]=1;
				}
			}
		}
		printf("%d\n",cnt);
	}	
	return 0;
}

F 分情况模拟即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;
int t,n,k,a,b,c;
int s[N];
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d%d",&a,&b,&c);
		if(c)
		{
			if(b&1)
			{
				for(int i=0;i<=c;i++) printf("1");
				for(int i=0;i<b;i++)
					printf("%d",i&1?1:0);
				for(int i=1;i<=a;i++) printf("0");
			}
			else if(b) 
			{
				for(int i=0;i<=c;i++) printf("1");
				for(int i=0;i<=a;i++) printf("0");
				for(int i=1;i<b;i++) printf("%d",i%2);
			}
			else 
				for(int i=0;i<=c;i++) printf("1");//a,c不等0,b等0的情况不存在
		}
		else
		{
			for(int i=0;i<=a;i++) printf("0");
			for(int i=1;i<=b;i++) printf("%d",i%2);
		}
		puts("");
	}	
	return 0;
}

G n大于4时排奇数再排偶数一定可以,n=4特判。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=8010;
int t,n,k;
int main()
{
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		if(n<4) puts("-1");
		else if(n==4) puts("2 4 1 3");
		else
		{
			if(n&1)
			{
				for(int i=1;i<=n;i+=2) printf("%d ",i);
				printf("%d %d ",n-3,n-1);
				for(int i=n-5;i;i-=2) printf("%d ",i);
			}
			else
			{
				for(int i=1;i<=n;i+=2) printf("%d ",i);
				printf("%d %d %d ",n-4,n,n-2);
				for(int i=n-6;i;i-=2) printf("%d ",i);
			}
			puts("");
		}
	}	
	return 0;
}
posted @ 2020-05-10 17:37  Neflidata  阅读(6)  评论(0编辑  收藏  举报