题目:https://www.luogu.org/record/show?rid=12702916

https://www.lydsy.com/JudgeOnline/problem.php?id=1168

一眼不可做...即使数据范围很小...

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int const xn=25;
int n;
ll a[xn],b[xn],inf=1e17;
bool cmp(int x,int y){return b[x]>b[y];}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%lld",&a[i]);for(int i=1;i<=n;i++)scanf("%lld",&b[i]);ll ansa=0,ansb=0; int tot=0;for(int i=1;i<=n;i++){if(a[i]&&!b[i])ansa+=a[i];else if(!a[i]&&b[i])ansb+=b[i];else if(a[i]&&b[i])a[++tot]=a[i],b[tot]=b[i];}int mx=(1<<tot); ll pa=inf,pb=inf;for(int s=0;s<mx;s++){ll tmpa=0,tmpb=0,mxa=inf,mxb=inf; int cnta=0;for(int i=1;i<=tot;i++){if(s&(1<<(i-1)))tmpa+=a[i],mxa=min(mxa,a[i]-1),cnta++;else tmpb+=b[i],mxb=min(mxb,b[i]-1);}if(cnta==tot)tmpa-=mxa; if(cnta==0)tmpb-=mxb;if(!cnta)tmpa++; else tmpb++;
//      if(cnta==tot)tmpa-=mxa,tmpb++;
//      else if(cnta==0)tmpb-=mxb,tmpa++;
//      else tmpa-=mxa,tmpb++;if(tmpa+tmpb<pa+pb)pa=tmpa,pb=tmpb;}printf("%lld\n%lld\n",pa+ansa,pb+ansb);return 0;
}

还写过10分的错误思路

首先,设每种颜色左右手套个数为 l[i],r[i],如果有 l[i]=0 或 r[i]=0,显然最劣情况要选,所以提前处理好;

设一个状态 ans(L),表示左手套取 L 个时的答案;

显然,这个答案是唯一的而且最劣的,现在要找到这个答案;

取 L 个左手套,根据取法的不同,可以取出许多种颜色集合,把每一个可能的集合记作 T;

而这些颜色集合又组成了一个集合,记作 A(L),表示选 L 个左手套会产生的颜色集合的集合;

考虑每个集合 T,在右边都对应一种最劣的选法,就是把不在 T 中的颜色都选了,最后再+1;

设这个为 R(T),即 R(T) = (∑r[i]) + 1,其中 i 不在集合 T 中;

所以,ans(L) = max{ R(T) },其中 T 是 A(L) 中的一个集合,这样做很妙地没有限制什么而找到了最劣答案,保证了正确性;

现在,考虑 A(L) 中有哪些 T,发现:

A(L) = { T | |T| <= L <= S(T) },其中 |T| 是 T 这个集合包含的颜色数量,S(T) 是 T 这个集合包含的那些颜色的手套个数的和;

由于我们找的是 max{ R(T) },而 |T| 越小,R(T) 越大,所以最终 ans(L) 的取值会是合法范围内某个 |T| 最小的,所以可以暂时忽略 |T| <= L 这个条件!!

所以,现在就变成若 S(T) >= L,则 R(T) 可以更新 ans(L);

然后,可以发现,会成为最终答案的 L,应该是某些颜色的手套全选,最后再+1,否则...应该不是最优的(感性理解...);

所以处理出这种 L,找 S(T) >= L 中 R(T) 最大的,可以用单调栈实现;

用结构体存一种集合的 S(T) 和 R(T),S(T) 同时也是上面所说的 L,按 S(T) 从小到大排序,不断弹栈令栈内 R(T) 是单调递减的,就能找到一个结构体后面(S(T) >= L)的 R(T) 最大值,对于一个 R(T) 也能去更新前面同等条件最小的 L;

还有些疑惑之处...就是一些 L 相同的结构体,排序时按 r<y.r 或 r>y.r 都可以过...但是感觉应该是 r<y.r 才对!后面就可以把前面都弹掉,则栈里后面元素的 S(T) 一定 >= L+1;

但如果栈里最后只留下一个值...难道因为这样构造所以不会出现这种情况?

总之勉强A了,思路还是很妙的。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int const xn=25;
int n,a[xn],b[xn],ansl,ansr,sta[1<<20],top;
struct N{int l,r;bool operator < (const N &y) const{return l==y.l?r<y.r:l<y.l;}//
}f[1<<20];
int rd()
{int ret=0,f=1; char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=0; ch=getchar();}while(ch>='0'&&ch<='9')ret=(ret<<3)+(ret<<1)+ch-'0',ch=getchar();return f?ret:-ret;
}
void update(int x,int y)
{if(ansl+ansr>x+y||(ansl+ansr==x+y&&ansl>x))ansl=x,ansr=y;
}
int main()
{n=rd(); int pl=0,pr=0,tot=0;for(int i=1;i<=n;i++)a[i]=rd();for(int i=1;i<=n;i++)b[i]=rd();for(int i=1;i<=n;i++){if(a[i]&&!b[i])pl+=a[i];else if(!a[i]&&b[i])pr+=b[i];else if(a[i]&&b[i])a[++tot]=a[i],b[tot]=b[i];}int mx=(1<<tot);for(int i=0;i<mx;i++)for(int j=1;j<=tot;j++){if(i&(1<<(j-1)))f[i].l+=a[j];else f[i].r+=b[j];}sort(f,f+mx);for(int i=0;i<mx;i++){while(top&&f[sta[top]].r<f[i].r)top--;sta[++top]=i;}ansl=1e9; ansr=1e9;for(int i=1;i<top;i++)update(f[sta[i]].l+1,f[sta[i+1]].r+1);printf("%d\n%d\n",ansl+pl,ansr+pr);return 0;
}

转载于:https://www.cnblogs.com/Zinn/p/9880913.html

洛谷 P4660 bzoj 1168 [ Baltic OI 2008 ] 手套 —— 分析+单调栈相关推荐

  1. 洛谷P2178 [NOI2015]品酒大会 后缀数组+单调栈

    P2178 [NOI2015]品酒大会 题目链接 https://www.luogu.org/problemnew/show/P2178 题目描述 一年一度的"幻影阁夏日品酒大会" ...

  2. 洛谷10月月赛Round.1| P3400 仓鼠窝[单调栈]

    题目描述 萌萌哒的Created equal是一只小仓鼠,小仓鼠自然有仓鼠窝啦. 仓鼠窝是一个由n*m个格子组成的行数为n.列数为m的矩阵.小仓鼠现在想要知道,这个矩阵中有多少个子矩阵!(实际上就是有 ...

  3. 洛谷 P4151 BZOJ 2115 [WC2011]最大XOR和路径

    //bzoj上的题面太丑了,导致VJ的题面也很丑,于是这题用洛谷的题面 题面描述 XOR(异或)是一种二元逻辑运算,其运算结果当且仅当两个输入的布尔值不相等时才为真,否则为假. XOR 运算的真值表如 ...

  4. 洛谷 P2046 BZOJ 2007 海拔(NOI2010)

    题目描述 YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域.简单起见,可以将YT市看作 一个正方形,每一个区域也可看作一个正方形.从而,YT城市中包括(n+1)×(n+1)个 ...

  5. 洛谷 P4175: bzoj 1146: [CTSC2008]网络管理

    令人抓狂的整体二分题.根本原因还是我太菜了. 在学校写了一个下午写得头晕,回家里重写了一遍,一个小时就写完了--不过还是太慢. 题目传送门:洛谷P4175. 题意简述: 一棵 \(n\) 个结点的树, ...

  6. 洛谷 3784(bzoj 4913) [SDOI2017]遗忘的集合——多项式求ln+MTT

    题目:https://www.luogu.org/problemnew/show/P3784 https://www.lydsy.com/JudgeOnline/problem.php?id=4913 ...

  7. 洛谷 P4546 bzoj 5020 在美妙的数学王国中畅游 —— LCT+泰勒展开

    题目:https://www.luogu.org/problemnew/show/P4546 先写了个55分的部分分,直接用LCT维护即可,在洛谷上拿了60分: 注意各处 pushup,而且 spla ...

  8. 【BZOJ】3039: 玉蟾宫(DP/单调栈)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3039 每次看到我的提交都有点淡淡的忧伤T_T.. 看到此题我想到用前缀和维护点ij向左和向上能拓展的 ...

  9. 洛谷 P4300 BZOJ 1266 [AHOI2006]上学路线route

    题目描述 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可:"很 ...

最新文章

  1. Charles是mac的iddler抓包工具
  2. csu 1554: SG Value 思维题
  3. 阿里云系列——4.网站备案后续(详细步骤)---2015-11.12
  4. mysql 5.7 备份innodb_mysql5.7 innodb数据库备份工具Xtrabackup的安装
  5. C# 3.0实现类本身的方法扩展
  6. 0-1背包动态规划c语言,动态规划解决0-1背包问题程序看不懂,请大家看看帮忙解决下...
  7. 【Pytorch神经网络理论篇】 04 Variable类型与自动微分模块剖析
  8. magento问题集
  9. mgr未同步 mysql_mysql8.0 搭建mgr踩坑记录
  10. mysql哪些字段适合索引_(转)Mysql哪些字段适合建立索引
  11. Vivado设计流程(二)设计文件输入
  12. Redis(十三)Python客户端redis-py
  13. 使用Jenkins自动化部署项目
  14. Unity的C#编程教程_17_Variables 挑战 3 折扣计算器
  15. DDoS攻击新玩法 暴雪上演营销新方式
  16. 企业公众号怎么做内容?这四个阶段要做好
  17. 无延时直播/超低延时直播画面同步性测试(实测组图)
  18. java基础入门-ZipOutputStream打包下载
  19. openamp RPU-APU双核间通信 建立多个通道
  20. 单总线协议(1—wire)

热门文章

  1. NOIP2002复赛 普及组 第1题
  2. 第16课 开灯关灯 《小学生C++趣味编程》
  3. Mysql数据库常用命令,mysql速学实用教程。
  4. 及时输出_安全光幕没有输出信号怎么办?-意普ESPE
  5. 写一个sql实现以下查询结果_SQL复杂查询—知识点梳理(四)
  6. STM32中GPIO_Mode--GPIO配置
  7. dedecms二次开发常用代码
  8. 基于javaweb的公交查询系统的设计与实现(含源文件)
  9. python的flask实现第三方登录怎么写_Python语言的Flask框架应用程序实现使用QQ账号登录的方法...
  10. Qt文档阅读笔记-Label QML Type官方解析及实例