大致题意:
写入一个01字符串,0表示女生,1表示男生。同时每个人拥有的钻石数是递增的。让你将男生划分到3,4组中。女生划分到1,2组中-->满足N1+N3==N2+N3
-----------------------------------------------------------------------------------------------------------------------
下面举个例子
输入内容 0101
钻石数 1234
分组情况 1423
思路:
令钻石总数为sum
1、当sum%2 != 0说明男女是不能平均分配的--->直接跳出就行
2、当sum%2 == 0说明男女之间可平均分配
那么我们就可以从末尾开始遍历直到找到满足sum半的即可。并且让他标记组数
-------------------------------------------------------------------------------------------------------------------------
下面附代码
#include<iostream> #include<algorithm> #include<sstream> #include<string> using namespace std; typedef long long ll; int main() { int t; cin>>t; while(t--) { string s,ans; //ans为标记字符串 ll n,sum; cin >> n; cin >> s; ans.resize(n,' '); //重置字符串的大小并且用' '全部代替。 sum=n*(n+1)/2; if(sum%2!=0) { cout<<-1<<endl; continue; } else { ll num=sum/2; //总数的一半 for(int i = n;i >= 1; i--) { if(num <= n && ans[num-1] == ' ') { if(s[num-1] == '1') ans[num-1] = '3'; else ans[num-1] = '1'; break; //跳出的目的是已找完 ----> 说明找到满足条件的总数一半 } num-=i; //每一次用一半减去此时用过的数 继续往下找 if(s[i-1] == '1') ans[i-1] = '3'; else ans[i-1] = '1'; } //在找完一半之后,让剩余为1的放入4组 为0的放入2组 for(int i = n;i >= 1; i--) { if(ans[i-1] == ' ') { if(s[i-1] == '1') ans[i-1] = '4'; else ans[i-1] = '2'; } } cout<<ans<<endl; } } }