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 ...
随机推荐
- C#中如何实现json转化时只处理部分属性
把对象转化为json字符串,很常用,但如果因为现在大部分项目都是用了ORM映射,导致一个对象的属性特别多,如果前台只需要部分属性如何实现? 当然最简单是所有属性都json化,前台只处理需要的属性,多余 ...
- jQuery 实现的瀑布流
<!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title> ...
- maven默认本地仓库
本地仓库是远程仓库的一个缓冲和子集,当你构建Maven项目的时候,首先会从本地仓库查找资源,如果没有,那么Maven会从远程仓库下载到你本地仓库.这样在你下次使用的时候就不需要从远程下载了.如果你所需 ...
- java Collections.sort()
sort()是Collections中的静态方法,用于对List容器中的元素排序. 如容器list中存储的是Integer对象 List<Integer> list =Arrays.asL ...
- centos7 tomcat自启动
第一步: vim /lib/systemd/system/tomcat.service [Unit] Description=tomcat After=network.target [Service] ...
- 【巷子】---redux---【react】
一.flux的缺陷 因为dispatcher和Store可以有多个互相管理起来特别麻烦 二.什么是redux 其实redux就是Flux的一种进阶实现.它是一个应用数据流框架,主要作用应用状态的管理 ...
- Android 如何让EditText不自动获取焦点 (转)
在项目中,一进入一个页面, EditText默认就会自动获取焦点. 那么如何取消这个默认行为呢? 在网上找了好久,有点 监听软键盘事件,有点 调用 clearFouse()方法,但是测试了都没有! x ...
- regasm 无法定位输入程序集
c# 写的DLL是32位的,在64位机器上注册时提示 无法定位输入程序集 方法1: 使用绝对路径: "%windir%\Microsoft.NET\Framework\v2.0.50727\ ...
- adb调试android设备 说的比较清楚的一篇文章
ADB支持两种连接Android系统的方式,USB方式及网络方式.一般手机及平板默认会设置为USB方式.android系统底层运行着一个服务(adbd),用于相应和管理大家在电脑端的adb命令连接,这 ...
- C/C++基础----标准库几个工具库tuple,bitset,正则表达式,随机数,IO库
tuple tuple可以有任意多个成员 默认初始化,值初始化 构造函数是explicit,必须直接初始化 make_tuple(v1,v2,-,vn) get<i> (t) 返回第i个数 ...