codeforce_div4_round640 ABCDEFG

参加了一场Codeforce Div4的比赛,发现题目难度适中,适合新手入门。遗憾的是E题,尝试用前缀和优化但未能成功,后来得知暴力即可。A、B、C、D、F、G题分别涉及数字拆分、构造、简单公式应用、模拟等,其中E题是最具挑战性的,需要理解为何暴力解法可行。
摘要由CSDN通过智能技术生成

div4纯见证历史,凑热闹来的,没想到题目真不难,唯一的遗憾的是E题,想了半个多小时前缀和优化,最后还是暴力,我到现在还不太理解为什么这个做法不T,没有特殊数据卡一下吗?十分的扎心。
整体来看,题目还是很贴心的,可能是因为第一场div4,所以放了个海,不跟div3一样出一些十分头大的题目,全都是暴力模拟或者简单构造。
A题拆分数字,B题稍麻烦,我觉得也算是构造了,贪心想一想,如果都是偶数,就拆分成k-1个2和一个偶数的情况,如果都是奇数,就拆分成k-1个1和一个奇数的情况,也不难,C题全场最简单,大佬的一分钟题目,然而我边界卡了下,重新推了一遍公式,花了点时间,D题双指针?也不算,就是个分别从两侧开始的模拟,然而我手慢,也写了挺久的,E题看了一眼觉得8000 * 8000 * 1000,暴力肯定不成,得优化,然后不会优化,左眼瞪右眼搞了半个多小时,所以赛后发现大佬说暴力就能过,因为求前缀和的时候也<=8000,break就行的时候,我的内心是崩溃的,F和G都是简单构造,F算是全场最难的一个,细节比G多一点。

A

#include <iostream>

using namespace std;
typedef long long LL;
LL a[30];
int main()
{
    int T; cin>>T;
    while(T--){
		LL x; cin>>x;
		int cnt=0;
		LL base=1;
		while(x){
			if(x%10){
				a[cnt++]=x%10*base;
				//cout<<x%10*base<<" ";
			}
			x/=10;
			base*=10;
		}
		cout<<cnt<<endl;
		for(int i=0;i<cnt;i++)
			cout<<a[i]<<" ";
		cout<<endl;
    }
    return 0;
}

B

#include <iostream>

using namespace std;

int main()
{
    int T; cin>>T;
    while(T--){
		int x,k; cin>>x>>k;
		if(x<k){
			cout<<"NO"<<endl;
			continue;
		}
		if((x-(k-1))%2==1){
			cout<<"YES"<<endl;
			for(int i=0;i<k-1;i++)
				cout<<1<<" ";
			cout<<x-(k-1)<<endl;
		}
		else{
			if(x>=2*k&&(x-(2*k-2))%2==0 ){
				cout<<"YES"<<endl;
				for(int i=0;i<k-1;i++)
				cout<<2<<" ";
			cout<<x-2*(k-1)<<endl;
			}
			else{
				cout<<"NO"<<endl;
			}
		}
    }
    return 0;
}

C

#include <iostream>

using namespace std;

int main()
{
    int T; cin>>T;
    while(T--){
		int n,k; cin>>n>>k;
		int cnt=(k-1)/(n-1);
		cout<<k+cnt<<endl;

    }
    return 0;
}

D

#include <iostream>

using namespace std;
int a[1005];
int main()
{
    int T; cin>>T;
    while(T--){
		int n;cin>>n;
		for(int i=0;i<n;i++) cin>>a[i];
		int l=0,r=n-1,t=0,sum1=0,sum2=0,last=0;
		int ans=0;
		while(l<=r){
			ans++;
			if(t&1){
				int now=0;
				while(now<=last){
					now+=a[r];
					r--;
					if(r<l) break;
				}
				last=now;
				sum2+=now;
			}
			else{//µÚÒ»¸öÈË
				int now=0;
				while(now<=last){
					now+=a[l];l++;
					if(r<l) break;
				}
				last=now;
				sum1+=now;
			}
			t++;
			if(l>r) break;
		}

			cout<<ans<<" "<<sum1<<" "<<sum2<<endl;

    }
    return 0;
}

E

#include <iostream>
//这代码跑了46ms,我真的想死了···
using namespace std;
int f[8005],a[8005];
int main()
{
    int T; cin>>T;
    while(T--){
		for(int i=0;i<=8000;i++) f[i]=a[i]=0;
		int n; cin>>n;
		for(int i=0;i<n;i++) cin>>a[i],f[a[i]]++;
		int ans=0;
		for(int i=0;i<n;i++){
			int sum=a[i];
			for(int j=i+1;j<n;j++){//因为n<=8000, 所以不T 这就nm离谱
				sum+=a[j];
				if(sum>n) break;
				ans+=f[sum];
				f[sum]=0;//防止重复计数
			}
		}
		cout<<ans<<endl;
    }
    return 0;
}

F

#include <iostream>

using namespace std;

int main()
{
    int T; cin>>T;
    while(T--){
		int a,b,c; cin>>a>>b>>c;
		if(a+b==0 || b+c==0 || a+c==0){
			if(a){
				for(int i=0;i<=a;i++)
					cout<<0;
			}
			else if(b){
				for(int i=0;i<=b;i++){
					if(i&1) cout<<0;
					else cout<<1;
				}
			}
			else{
				for(int i=0;i<=c;i++)
					cout<<1;
			}

		}
//		else if(a==0 ||b==0 ||c==0){
//
//		}
		else{
			for(int i=0;i<=a;i++)
				cout<<0;
			for(int i=0;i<(b-1)/2;i++)
				cout<<"10";
		for(int i=0;i<=c;i++)
			cout<<1;
		if(b%2==0&&b)
			cout<<0;

		}
		cout<<endl;
    }
    return 0;
}

G

#include <iostream>

using namespace std;

int main()
{
    int T; cin>>T;
    while(T--){
		int n; cin>>n;
		if(n<=3) cout<<-1<<endl;
		else if(n==4){
			cout<<2<<" "<<4<<" "<<1<<" "<<3<<endl;
		}
		else{
			for(int i=1;i<=n;i+=2){
				cout<<i<<" ";
			}
			int x;
			if(n%2==0) x=n-4;
			else x=n-3,n--;
			cout<<x<<" ";
			for(int i=n;i>0;i-=2){
				if(i!=x)
				cout<<i<<" ";
			}
			cout<<endl;
		}
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值