Codeforces 851 div2

CodeForces 851 div 2 (ABC)

A (签到)

题意:给定一个数组,只有0和1,问能否找到某个i,使得前i个数的连乘等于后面的数的连乘。
题解:记录数组中2的个数为cnt,奇数无解,遍历数组,当遍历到2的个数等于cnt/2则为答案。

void solve()
{
	cin>>n;
	cnt[1]=cnt[2]=0;
	for(int i=1;i<=n;i++) 
	{
		cin>>a[i];
		cnt[a[i]]++;
	}
	if(cnt[2]%2) cout<<-1<<endl;
	else 
	{
		int c=0;
		for(int i=1;i<=n;i++) 
		{
			if(a[i]==2) c++;
			if(c==cnt[2]/2) {cout<<i<<endl;return;}
		}
	}
}

B

题意 :给一个数N,找到两个数X,Y, 使得X+Y = N且,X与Y的数位和不超过1。
题解 : 当N的当前位为奇数,则其中一个数比另一个数多拿1,当下次遇到奇数时反过来操作就好了。

void solve()
{
	cin>>n;
	cnt=0;
	if(n%2==0) {cout<<n/2<<" "<<n/2<<endl;return;}
	int ans1=0,ans2=0,ok=1;
	while(n) a[++cnt]=n%10,n/=10;
	while(cnt)
	{
		int x=a[cnt];
		if(x%2==0) ans1=ans1*10+x/2,ans2=ans2*10+x/2; 
		else if(ok) ans1=ans1*10+(x+1)/2,ans2=ans2*10+x/2,ok=0;
		else ans1=ans1*10+x/2,ans2=ans2*10+(x+1)/2,ok=1;
		cnt--;
	}
	cout<<ans1<<" "<<ans2<<endl;
}

C(构造)

题意:给定一个n,要从1~2n中选出n个数对,每个数对p[i]={xi,yi},si= xi+yi,问是否可以构造出n个数对,使得s1 = s2-1,s2 = s3-1,以此类推。
题解:看样例可以得出偶数无解,在手算了几个数后找到了规律。
n=5 : {1,10},{2,8},{3,6},{4,9},{5,7} -> 11,10,9,13,12
n=7 : {1,14},{2,12},{3,10},{4,8},{5,13},{6,11},{7,9} ->15 14 13 12 18 17 16

void solve()
{
	cin>>n;
	if(n%2==0) {cout<<"NO"<<endl;return;}
	int l1=2*n,l2=l1-1;
	for(int i=1;i<=n;i++)
	{
		if(i<=(n+1)/2) p[i]={i,l1},l1-=2;
		else p[i]={i,l2},l2-=2;
	}
	cout<<"YES"<<endl;
	for(int i=1;i<=n;i++) {cout<<p[i].x<<" "<<p[i].y<<endl;}
}

posted @ 2023-02-10 09:31  Liang2003  阅读(22)  评论(0编辑  收藏  举报