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 ...
随机推荐
- MySQL Session--批量KILL会话
使用SELECT INTO OUTFILE+SOURCE批量KILL ## 查看kill_id文件是否存在 SYSTEM cat /tmp/kill_id.sql ## 如果文件存在,则先删除 sys ...
- sofa graphql 2 rest api webhook 试用
sofa 的webhook实际上就是将graphql 的subscription 进行了扩展,当接受到sub 请求的时候 再做一次http 的转发处理,方便rest api 的访问 环境准备 环境还是 ...
- 让Windows XP的键盘“说话”,全语音键盘
长期面对无声的电脑,我们难免疲倦.如果正在输入的内容被系统一字(字母)不差地念出来,你还能在无声的疲倦中输入错误的内容吗?本文以Windows 2000/XP中一个鲜为人知的“讲述人”为例,来教你DI ...
- phpstorm 2017激活码(方法)
JetBrains激活 JetBrains 授权服务器(License Server URL):http://idea.imsxm.com 使用方法:激活时选择License server 填入htt ...
- FastAdmin 开发学习给输入框加上清除功能
FastAdmin 开发学习给输入框加上清除功能 在社区上有小伙伴询问如果给输入框加上清除功能,因为有时修重新搜索时需要将输入框的内容快速清除,所以这个功能对用户非常友好. 如上图所示这种. 我看了一 ...
- mysql之 表空间传输
说明:MySQL(5.6.6及以上),innodb_file_per_table开启. 1.1. 操作步骤: 0. 目标服务器创建相同表结构1. 目的服务器: ALTER TABLE t DISCAR ...
- mysql 5.45 以后需要 需要 安全套接字问题
错误异常:According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established ...
- java自动装箱的一个例子
Object obj = 56; int i = (Integer)obj; 第一行等价于: Object obj = Integer.valueOf(56); Integer.valueO ...
- mysql性能分析show profile/show profiles
MySQL性能分析show profiles show profile 和 show profiles 语句可以展示当前会话(退出session后,profiling重置为0) 中执行语句的资源使用情 ...
- openLayer3地图的使用心得
准备运行环境: 1)Portable Basemap Server(PBS)用于创建地图服务 官网网址:http://geopbs.codeplex.com/ 如何创建底图服务?操作步骤如下: 如果启 ...