Description:

给你2个长度为n的01串

从中选出\(n/2\)个,使得选出的数中第一排1的个数等于未选出数中第二排1的个数

输出一种方案即可,没有输出-1

Hint:

\(n \le 5000\)

Solution:

这题比赛的时候傻逼了

后面发现其实就是暴力枚举解方程

\(AuBao\)想出一个O(n)做法力碾标算,这里放出来%一%:

设\(a_i\)为所选第一排是1的数

\(b_i\)表示其对应第二排的数

设\(sum\)表示第二排1的个数

有:

\[\sum a_i = sum- \sum b_i
\]

移过去用d数组代替

\[\sum d_i = sum
\]

现在考虑d的取值,显然有0,1,2三种

\[cnt0*0+cnt1*1+cnt2*2=sum
\]

\[cnt0+cnt1+cnt2=n/2
\]

\[cnt1*1+cnt2*2=sum
\]

\[cnt0+cnt1+cnt2=n/2
\]

O(n)枚举即可

另附被爆踩的官方\(n^2\)的做法:

#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define ls p<<1
#define rs p<<1|1
using namespace std;
typedef long long ll;
const int mxn=1e5+5;
int n,m,cnt,hd[mxn]; inline int read() {
char c=getchar(); int x=0,f=1;
while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}
while(c<='9'&&c>='0') {x=(x<<3)+(x<<1)+(c&15);c=getchar();}
return x*f;
}
inline void chkmax(int &x,int y) {if(x<y) x=y;}
inline void chkmin(int &x,int y) {if(x>y) x=y;} struct ed {
int to,nxt;
}t[mxn<<1]; inline void add(int u,int v) {
t[++cnt]=(ed) {v,hd[u]}; hd[u]=cnt;
} char p[5005],q[5005];
int sum,cnt0,cnt1,cnt2;
vector<int > g0,g1,g2; int main()
{
n=read(); scanf("%s %s",p+1,q+1);
for(int i=1;i<=n;++i) {
if(p[i]=='0'&&q[i]=='0') ++cnt0,g0.push_back(i);
if(p[i]=='0'&&q[i]=='1') ++cnt1,g1.push_back(i),++sum;
if(p[i]=='1'&&q[i]=='0') ++cnt1,g1.push_back(i);
if(p[i]=='1'&&q[i]=='1') ++cnt2,g2.push_back(i),++sum;
}
int c1,c0;
for(int i=0;i<=cnt2;++i) {
c1=sum-i*2; c0=n/2-i-c1;
if(c1<0||c0<0) continue ;
if(c1<=cnt1&&c0<=cnt0) {
for(int j=0;j<c0;++j)
printf("%d ",g0[j]);
for(int j=0;j<c1;++j)
printf("%d ",g1[j]);
for(int j=0;j<i;++j)
printf("%d ",g2[j]);
exit(0);
}
}
puts("-1");
return 0;
}

[CF1138B]Circus的更多相关文章

  1. [CareerCup] 11.7 Tower of People in Circus 马戏团的人塔

    11.7 A circus is designing a tower routine consisting of people standing atop one another's shoulder ...

  2. cf------(round)#1 C. Ancient Berland Circus(几何)

    C. Ancient Berland Circus time limit per test 2 seconds memory limit per test 64 megabytes input sta ...

  3. HDU 5515 Game of Flying Circus 二分

    Game of Flying Circus Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem ...

  4. 难部署的taiga,式微的circus——趋势从进程管理到容器管理,简单才是美

    一直需要一个项目管理系统,一直没时间弄. taiga是github上搜project management star最多的项目,又是基于django用python写的后端,所以就用它: 但是,集中精力 ...

  5. Codeforces Beta Round #1 C. Ancient Berland Circus 计算几何

    C. Ancient Berland Circus 题目连接: http://www.codeforces.com/contest/1/problem/C Description Nowadays a ...

  6. AC日记——codeforces Ancient Berland Circus 1c

    1C - Ancient Berland Circus 思路: 求出三角形外接圆: 然后找出三角形三条边在小数意义下的最大公约数; 然后n=pi*2/fgcd; 求出面积即可: 代码: #includ ...

  7. CodeForces - 1C:Ancient Berland Circus (几何)

    Nowadays all circuses in Berland have a round arena with diameter 13 meters, but in the past things ...

  8. circus && web comsole docker-compose 独立部署web console 的一个bug

    如果直接使用以下的docker-compose 文件部署会有通过多播通信获取endpoint 异常的问题(circus 在stats endpoint 获取少了一个c) 这个问题是部分网络情况下会出现 ...

  9. circus security 来自官方的安全建议

    转自:https://circus.readthedocs.io/en/latest/design/security/ Circus is built on the top of the ZeroMQ ...

随机推荐

  1. Oracle 数据库基础知识

    depyno 部门编号 部门表 dname 部门名称 location 地址----------------------------------------empno 员工编号 员工表ename 员工 ...

  2. JSON字符串与Map互转

    //一.map转为json字符串 public static String map2jsonstr(Map<String,?> map){ return JSONObject.toJSON ...

  3. C#调用Bartender打印

    BarTender是一款优秀的条形码打印软件,可以支持很多种类型的条形码设计和打印,具体大家可参考他的官网(http://www.seagullscientific.com/aspx/products ...

  4. makefile 嵌套

    目录结构: dynamic 和 static 两个目录实现加法功能, 分别生成动态库和静态库,   main.c 主文件链接加法功能,  终端命令执行:   make dynamic=1  则编译动态 ...

  5. Windows10安装Debug

    1. 什么是Debug? Debug是DOS.Windows都提供的实模式(8086方式)程序的调试工具. 使用它,可以查看CPU各种寄存器中的内容.内存的情况和在机器码级别跟踪程序的运行. 2. 常 ...

  6. LeetCode第十七题-电话号码的字母组合

    Letter Combinations of a Phone Number 问题简介: 给定包含2-9的数字的字符串,返回该数字可能表示的所有可能的字母组合. 下面给出了数字到字母的映射(就像在电话按 ...

  7. 【linux终端操作】

    1. ctr + alt + t 打开新的终端窗口2. ctr + shift + + 终端窗口字体放大3. ctr + - 终端窗口字体缩小4. ls : 查看目录下的文件信息5. pwd: 查看目 ...

  8. session前后台交互

    下面是需求需要,不同的人群进来显示不同,但是还必须是这个走到哪都的存在,不能说点击别的页面,下面红框处的数据就没有了,必须是存在的并且登陆的类型不一样,显示的也不一样,开始的时候想到的是直接调用方法, ...

  9. c++入门篇七

    拷贝构造函数的调用时机: class Person { public: //构造函数 Person() { //无参构造函数 } Person(int a) { //有参构造函数 cout <& ...

  10. js获取当前时间并实时刷新

    效果如图: 代码如下: <html> <head> <title>js获取当前时间并实时刷新</title> <script> //页面加载 ...