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数据库报Communications link failure
事情的起因: 某项目的开发同学突然Q我们组的某同学,要求我们调整MySQL的连接等待超时参数wait_timeout.要求我们从28800s调整到31536000s(也就是一年) 应用端测试环境的to ...
- ES9新特性
这篇文章主要介绍ES2018(ES9)的新特性, 以及使用方法 JS是一门跨平台的语言, ES6也就是ECMAScript 2015 花费了5年的时间敲定, 是一次非常大的改版, 之后每年都有一个小版 ...
- zookeeper 图形化的客户端工具:ZooInspector
查看Zookeeper中的数据,我们可以通过ZkCli.sh命令客户端查看,但是不太直观,因为Zookeeper本身数据是以树型结构存储组织的, 今天推荐一个实用的界面操作工具ZooInspector ...
- centos git server 的搭建
安装环境 centos7 说明:centos yum 库里面的git 好像是不区分 客户端和服务器端, 安装 git 以后 就可以创建 仓库,也可以检出 别的 git 仓库的 代码了.所以不 ...
- spring-IOC容器(三)
一.通过工厂方法配置Bean: .xml <!-- class属性:指向静态工厂方法的全类名 factory-method:指向静态工厂方法的名字 constructor-arg:如果工厂方法需 ...
- Ribbon Ping机制
在负载均衡器中,提供了 Ping 机制,每隔一段时间,会去 Ping 服务器,判断服务器是否存活,该工作由 com.netflix.loadbalancer.IPing 接口的实现类负责,如果单独使用 ...
- Block Design 小技巧之添加RTL代码到block_design
Block Design 小技巧之添加RTL代码到block_design 1.首先得打开Block Design,右击RTL文件,才会出现Add module to Block Design选项. ...
- [转]jsPlumb插件做一个模仿viso的可拖拉流程图
原贴:https://www.cnblogs.com/sggx/p/3836432.html 前言 这是我第一次写博客,心情还是有点小小的激动!这次主要分享的是用jsPlumb,做一个可以给用户自定义 ...
- button高度改变
代码:<input type="button" name="submit" value="submit" /> 利用css改变b ...
- mysql 性能
https://blog.csdn.net/zengxuewen2045/article/category/6388631 #sda 磁盘信息dstat -D sda 3 5 #找出系统瓶颈dstat ...