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 ...
随机推荐
- Embedded SW uses STL or not
As the complexity increasing of embedded software, more and more projects/products use C++ as the im ...
- 自制操作系统Antz -- 系列文章
自制操作系统Antz day10——实现shell(上) AntzUhl 2018-10-10 16:25 阅读:192 评论:0 Linux内核源码分析 day01——内存寻址 AntzUhl ...
- ESB雏形 -- 项目企业服务总线初始
今天要厚着脸皮给大家推荐一个自己做的通信中间件——ServiceAnt,目前已经在我们团队的两个产品线上投入了使用. ServiceAnt是什么 它最初的定位是ESB(企业服务总线),但目前还没有达到 ...
- 存储-实例-ibm v3700
raid5总容量计算(n-1)*最小盘容量 RAID0:N块盘组成,逻辑容量为N块盘容量之和:RAID1:两块盘组成,逻辑容量为一块盘容量:RAID3:N+1块盘组成,逻辑容量为N块盘容量之和:RAI ...
- URL整理
Airtest project官网 http://airtest.netease.com/ poco辅助文档:http://poco.readthedocs.io/zh_CN/latest/index ...
- [转]Spring IOC父子容器简介
通过HierarchicalBeanFactory接口,Spring的IoC容器可以建立父子层级关联的容器体系,子容器可以访问父容器中的Bean,但父容器不能访问子容器的Bean.在容器内,Bean的 ...
- git 常见命令 和 git 原理图
git 工作原理图:git 有4 个仓库 这是 git和 svn 一个巨大的区别,所以git 没网也能提交代码和查看记录. svn 只有2 个仓库 ,一个远程一个本地. 1 创建git 仓库( 参数 ...
- centos7下git服务器端搭建(转)
git的安装: yum 源仓库里的 Git 版本更新不及时,最新版本的 Git 是 1.8.3.1,但是官方最新版本已经到了 2.9.2.想要安装最新版本的的 Git,只能下载源码进行安装. 1. 查 ...
- Windows Azure Virtual Network (12) 虚拟网络之间点对点连接VNet Peering
<Windows Azure Platform 系列文章目录> 在有些时候,我们需要通过VNet Peering,把两个虚拟网络通过内网互通互联.比如: 1.在订阅A里的Virtual N ...
- Python模块简介及安装 [numpy,pandas,matplotlib,scipy,statsmodels,Gensim,sklearn,keras]
https://pan.baidu.com/s/1bpVv3Ef 67bd 模块安装文件下载地址 pip install "numpy-1.12.0b+mkl-cp35- ...