描述:给一串01组成的字符,0,1代表性别,第i个人有i个宝石,要求把女生分到1,2组,男生分到3,4组,分组之后1,3组的宝石数量等于2,4组的宝石数量。
分析:1,3和2,4分别都是一组男一组女,所以可以先考虑宝石数怎样相等,性别先不考虑。
宝石总数是偶数时才能平分,所以n%4==1和n%4==2的情况都要输出-1.
对于n%4==0:
1 2
4 3
5 6
8 7
....
这样蛇形排列就可以满足条件。
对于n%4==3:
1 7
6 2
3 5
4
可以每次排首尾两个元素,最后会剩一个元素,排到1所在的那组就可以了。
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int t;
cin>>t;
string s;
int ans[201000];
while(t--)
{
int n;cin>>n;
cin>>s;
if(n==1||n==2||n==0) printf("-1\n");
else if(n%2==1)//奇数
{
if((n+1)%4==0)
{
for(int i=0;i<n/2;i++)
{
if(i%2==0)
{
if(s[i]=='0')
ans[i]=1;
else ans[i]=3;
if(s[n-i-1]=='0')
ans[n-i-1]=2;
else ans[n-i-1]=4;
}
else
{
if(s[i]=='0')
ans[i]=2;
else ans[i]=4;
if(s[n-i-1]=='0')
ans[n-i-1]=1;
else ans[n-i-1]=3;
}
}
if(n%2==1) {
if(s[n/2]=='1')
ans[n/2]=3;
else ans[n/2]=1;
}
for(int i=0;i<n;i++) printf("%d",ans[i]);
printf("\n");
}
else printf("-1\n");
}
else//偶数
{
if(n%4==2) printf("-1\n");
else
{
for(int i=0;i<n/2;i++)
{
if(i%2==0)
{
if(s[i*2]=='0')
ans[i*2]=1;
else ans[i*2]=3;
if(s[i*2+1]=='0')
ans[i*2+1]=2;
else ans[i*2+1]=4;
}
else
{
if(s[i*2]=='0')
ans[i*2]=2;
else ans[i*2]=4;
if(s[i*2+1]=='0')
ans[i*2+1]=1;
else ans[i*2+1]=3;
}
}
for(int i=0;i<n;i++) printf("%d",ans[i]);
printf("\n");
}
}
}
return 0;
}