题意:

第一行给出T代表有几个测试样例,

第二行给出n代表有几个人,

第三行给出一个由0和1组成的字符串,0代表女生,1代表男生。

并且第i个人有i个宝石。

现在要把这些人分为四组,G1 G2 两组是女生组,G3 G4两组是男生组。

分配后要满足  (G1+G3)的宝石 ==(G2+G4)的宝石

然后输出这些人被分配到哪一组的字符串。

如果有多个结果随便哪一个都行,如果没有结果输出-1。

思路:

首先把所有宝石的总和判断一下,看看是偶数还是奇数,如果是奇数肯定分不均,直接输出-1.

然后把宝石总和分一半,先给G1和G3组分配人。

也就是从第n个人开始分配组,如果G1和G3分够了宝石的一半,那剩下的就都是G2和G4的了。

#include<iostream>
#include<algorithm>
#include<sstream>
#include<string>
using namespace std;
typedef long long ll; int T;
int main()
{
cin >> T;
while (T--)
{
ll n;
ll half;
ll sum;
string num;
string ans; cin >> n;
ans.resize(n, ' ');//这个很重要,重新分配了答案字符串的大小,方便分配组
cin >> num; sum = n * (n + 1) / 2;//宝石的总和
if (sum & 1) { cout << -1 << endl; continue; }//如果是奇数就直接输出-1 half = sum / 2;//宝石分一半
for (int i = n; i >= 1; i--){//从后面开始分
if (half <= n && ans[half - 1] == ' '){//half<=n意味着可以直接从中挑人分组了
if (num[half - 1] == '1') {
ans[half - 1] = '3';
}
else {
ans[half - 1] = '1';
}
break;
}
half -= i;//表示已经分配掉这个人了
if (num[i - 1] == '1') {
ans[i - 1] = '3';
}
else{
ans[i - 1] = '1';
}
} for (int i = n; i >=1; i--){
if (ans[i - 1] == ' '){
if (num[i - 1] == '1') {
ans[i - 1] = '4';
}
else {
ans[i - 1] = '2';
}
}
}
cout << ans << endl;
}
return 0;
}

  

最新文章

  1. 文本框focus之后高亮背景颜色
  2. Python’s SQLAlchemy vs Other ORMs[转发 5] PonyORM
  3. word2vec模型原理与实现
  4. asr,tts,vsr
  5. IE 浏览器下 button元素自动触发click?
  6. Java经典面试题
  7. hdu 5144 NPY and shot
  8. RedGate 工具SQLTEST 1.0.15.1
  9. Vue源码学习02 初始化模块init.js
  10. js实现语音功能
  11. synchronized底层实现学习
  12. Java——代码块
  13. J2SE 8的流库 --- 转换流, 得到的还是流
  14. IDFA
  15. 问题-DelphiXE10.1 FireDAC联接oracle数据库方法
  16. 【Ubuntu】boot空间不足
  17. su:鉴定故障
  18. curl 知识点
  19. 解决svn Authorization failed错误
  20. 浏览器web端详解

热门文章

  1. Mysql:循环结构
  2. SpringMVC: JSON
  3. Linux每日练习-crontab
  4. pppd调试心得.md
  5. Windows系统JDK环境变量配置
  6. bugku-Web 文件包含2
  7. 用Maven整合SSM项目实例
  8. 路飞学城—Python爬虫实战密训班 第二章
  9. phpstorm 的下载、安装与激活
  10. filter的原理(转)