Round545div2B(1138B)
一、题目链接
https://codeforces.com/problemset/problem/1138/B
二、思路
贪心是肯定不行的。
设会$[1,0]$的人存在容器$p_1$里面,会$[0,1]$的人存在容器$p_2$里面,会$[1,1]$的人存在容器$p_3$里面,会$[0,0]$的人存在容器$p_4$里面。
设$p_1.size()==s_1$,$p_2.size()==s_2$,$p_3.size()==s_3$,$p_4.size()==s_4$。
枚举在$p_1$部分选择的人数$i$,在$p_3$部分选择的人数$j$,那么,$p_1$部分剩余的$s_1-i$个人和$p_3$部分剩余的$s_3-j$个人,一定要被分到第二场演出(第二部分)。这时,把所有非法情况判掉,答案就出来了。
非法情况如下:
1.$s_2+s_3-j<i+j$,剩余的第二部分的人数不够枚举出来的第一部分的人数;
2.$s_2<s_2+s_3-j-(i+j)$,为了和第一部分枚举的人数平衡,第二部分多出来的属于$p_2$容器里面的人,都必须要放到第一部分去,如果把所有$p_2$容器里面的人全部放到第一部分后,剩余的第二部分的人(全部来自$p_3$,数量就是$s_3-j$),还是比$i+j$多,那么,也就是满足当前这个条件,非法;
为表示方便,用$part2sub=s_2+s_3-j-(i+j)$,表示属于容器$p_2$的人要被放到第一部分的数量。
3.$i+j+part2sub>\frac{n}{2}$,枚举的第一部分的人数,加上容器$p_2$里面被强制放过来的人数,多于一半,非法;
4.$s_2+s_3-j-part2sub+s_1-i>\frac{n}{2}$,$s_2+s_3-j-part2sub$是为了和枚举的第一部分的人数相同而计算出来的第二部分的且在第二部分起作用的人数(起作用就是说,它是$p_2$或者$p_3$容器里面的人),$s_1-i$是属于容器$p_1$的人被强制放到第二部分的数量,这两项加起来,就是为了排除上述非法条件而强制放到第二部分的人数。如果这两项之和大于总数的一半,非法;
排除了上述4个条件,答案就出来了。在容器$p_1$取$i$个人,在容器$p_3$取$j$个人,在容器$p_2$取$part2sub$个人,剩余的$\frac{n}{2}-i-j-part2sub$个人,去$p_4$里面取。
三、代码
//
// Created by fuzhihong on 3/8/19.
//
#include<bits/stdc++.h>
using namespace std;
];
], b[];
vector<int> res, p1, p2, p3, p4, p5;
int main() {
cin >> n;
scanf();
scanf();
; i <= n; ++i) {
')p1.push_back(i);
')p2.push_back(i);
')p3.push_back(i);
')p4.push_back(i);
}
int s1 = p1.size(), s2 = p2.size(), s3 = p3.size(), s4 = p4.size();
; i <= s1; ++i) {
; j <= s3; ++j) {
int part2 = s2 + s3 - j;
if (part2 < i + j)continue;
if (s2 < part2 - (i + j))continue;
int part2sub = part2 - (i + j);
)continue;
)continue;
; k < i; ++k)printf("%d ", p1[k]);
; k < j; ++k)printf("%d ", p3[k]);
; k < part2sub; ++k)printf("%d ", p2[k]);
; k < n / ; ++k, ++x)printf("%d ", p4[x]);
//printf("\n%d %d\n",i,j);
;
}
}
puts("-1");
;
}
/*
*
4
0011
1100
4
0011
0011
4
0011
0000
8
01100000
10100000
10
1111100000
0000001111
*
* **/
Round545div2B(1138B)的更多相关文章
- Codeforces 1138B(列方程枚举)
构造模拟要分情况讨论感觉不是够本质,然后官解是因为只有四个量所以可以根据限制条件列两个方程,再枚举一下解就可以了. const int maxn = 5000 + 5; int n, c[maxn], ...
- Codeforces 1138B Circus (构造方程+暴力)
题意: 给你两个01串,要你选n/2个位置,使得选的位置在s1中"1"的数量等于未选的s2中"1"的数量 n<=5000,1s 思路: 设两个串中出现&q ...
随机推荐
- HDU1370(中国剩余定理)
昨天我细致一想,发现自己之前的分类(用OJ来划分,毫无意义啊.)太失败了,所以我又一次划分了一下大分类,在分到数论的时候,我就想起了中国剩余定理了.于是乎今天就刷了一题中国剩余定理的题目了.话说太久没 ...
- WikiBooks/Cg Programming
https://en.wikibooks.org/wiki/Cg_Programming Basics Minimal Shader(about shaders, materials, and gam ...
- Java高级特性 第3节 java中常用的实用类(2)
§String类 一.创建字符串对象 采用字面值的方式赋值:String s = "abc"; 用new关键字:String s = new String("vfggkf ...
- prop-types:该第三方库对组件的props中的变量进行类型检测
利用prop-types第三方库对组件的props中的变量进行类型检测
- python多线程、多进程相关知识
Queue Queue用于建立和操作队列,常和threading类一起用来建立一个简单的线程队列. 首先,队列有很多种,根据进出顺序来分类,可以分成 Queue.Queue(maxsize) FIFO ...
- ubuntu忘记登录密码解决方法
1.重启系统,长按Shift键,直到出现下面菜单.选择recovery mode(恢复模式).2.接下来会进入如下界面,选择Drop to root shell prompt ,也就是获取root权限 ...
- 导入JSONPathExtractorExample.jmx文件报错,导不进去
导入之前写的JSONPathExtractorExample.jmx文件,导入不进来,报如下错,百度搜索说是缺少jar包 复制别人的信息如下 有的时候我们会参考别人的jmx文件,但是在导入的时候会报错 ...
- jmap MAT内存溢出实践
jmap MAT内存溢出实践 一.创建Spring Boot工程 进入https://start.spring.io/网站,配置如下图 点击创建工程,然后用Idea或者Eclipse打开 二.创建模拟 ...
- HanLP极致简繁转换详细讲解
HanLP极致简繁转换详细讲解 作者: hankcs(大快高级研究员 hanlp项目负责人) 谈起简繁转换,许多人以为是小意思,按字转换就行了.事实上,汉语历史悠久,地域复杂,发展至今在字符级别存在“ ...
- Java WebService 简单实例[转载]
[注意,本文转载自 http://hyan.iteye.com/ ] 一.准备工作(以下为本实例使用工具) 1.MyEclipse10.7.1 2.JDK 1.6.0_22 二.创建服务端 1 ...