【Codeforces Round #546 (Div. 2)】B.Circles

(戳这里!)原题链接

题意:

给两个长度为n(n为偶数)的01字符串 A, B

 

要求把1-n分均为两份,要求第一份里ai的和等于第二份里bi的和,

 

思路:

aibi有四种可能:01,10,00,11

建四个队列,分别入队,

然后根据01,10个数将11队列出队分配给01,10队列,

然后再判断当前01,10个数,把多的那一个多出来的分到另一个新的队列里(001或010),

当01,10队列元素个数相同时,他们的和相等,

然后再把刚才取出的队列元素全部出队入队到他原来队列的相反队列中,

然后根据10,01队列元素个数分配00队列

判断01,10队列元素个数是否相等不相等-1,

代码:

#include<cstring>
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;
int t;
char nn[5009],n[5009];
int ans=-1,pos=1;
int n01,n00,n10,n11;
int a[5009];
queue<int>q11,q01,q10,q00,q001,q010;
int main(){
	cin>>t;
	for(int i=1;i<=t;i++){
		scanf(" %c",&n[i]);
	}
	for(int i=1;i<=t;i++){
		scanf(" %c",&nn[i]);
		if(nn[i]=='1'){
			if(n[i]=='1')q11.push(i);
			else q01.push(i);
		}
		else if(n[i]=='1')q10.push(i);
		else q00.push(i);
	}
	n01=q01.size();
	n10=q10.size();
	while(!q11.empty()){//11
		int k=q11.front();
		q11.pop();
		if(q01.size()>=q10.size())	q10.push(k);
		else if(q01.size()<q10.size())q01.push(k);
	}
	if(q01.size()>q10.size()){
	while(q01.size()>q10.size()){
		n01--;
		if(n01<0){cout<<-1<<endl;return 0;}
		int k=q01.front();
		q01.pop();
		q010.push(k);
	} }
	else {
	while(q10.size()>q01.size()){
		n10--;
		if(n10<0){cout<<-1<<endl;return 0;}
		int k=q10.front();
		q10.pop();
		q001.push(k);
	}
	}
	while(!q010.empty()){
		int o=q010.front();
		q010.pop();
		q10.push(o);
		}
	while(!q001.empty()){
		int o=q001.front();
		q001.pop();
		q01.push(o);
	}
	while(!q00.empty()){
		int k=q00.front();
		q00.pop();
		if(q01.size()>q10.size())	q10.push(k);
		else q01.push(k);
	}
	if(q01.size()!=q10.size()){cout<<-1<<endl;return 0;}
	cout<<q10.front();
	q10.pop();
	while(!q10.empty()){
		cout<<' '<<q10.front();
		q10.pop();
	}
	cout<<endl;
}

吐槽:这个题写死我了,写了三个小时,一开始打完一百多行,然后删了重写,最后debug半天发现q01写错q10..代码能力还是不行

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值