博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ3523[Poi2014]Bricks——贪心+堆
阅读量:5127 次
发布时间:2019-06-13

本文共 1188 字,大约阅读时间需要 3 分钟。

题目描述

有n种颜色的砖块,第i种颜色的砖块有a[i]个,你需要把他们放成一排,使得相邻两个砖块的颜色不相同,限定第一个砖块的颜色是start,最后一个砖块的颜色是end,请构造出一种合法的方案或判断无解。

输入

第一行3个数,n,start,end。

第二行n个数,a[i]。

输出

令m=sigma(a[1..n])。

如果有解输出m个数。
无解输出0。

样例输入

3 3 1
2 3 3

样例输出

3 2 1 3 2 3 2 1

提示

【数据范围】

n,m≤1000000,1≤start,end≤n

  

  为了防止排到后面一样的砖块太多排不开,所以要贪心的每个位置排当前剩余块数最多的颜色的砖块,如果有多个颜色剩余最多,要优先考虑和末尾颜色相同的来防止倒数第二个和最后一个颜色相同。用堆维护当前位置块数最多的颜色取就好了。

#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;int s,t,n,m;bool flag;struct node{ int x,y;};bool operator < (node a,node b){ if(a.x!=b.x) { return a.x
q;int ans[1000010];int main(){ scanf("%d%d%d",&n,&s,&t); node miku,jhin; for(int i=1;i<=n;i++) { scanf("%d",&miku.x); m+=miku.x; miku.y=i; if(i==s) { miku.x--; } if(i==t) { miku.x--; } if(miku.x<0) { printf("0"); return 0; } q.push(miku); } ans[1]=s; ans[m]=t; for(int i=2;i
1) { q.push((node){miku.x-1,miku.y}); } if(flag) { q.push(jhin); } } if(ans[m-1]==ans[m]) { printf("0"); return 0; } for(int i=1;i<=m;i++) { printf("%d ",ans[i]); }}

转载于:https://www.cnblogs.com/Khada-Jhin/p/9592051.html

你可能感兴趣的文章
steelray project viewer
查看>>
itext jsp页面打印
查看>>
HTTP之报文
查看>>
Perl正则表达式匹配
查看>>
windows下的文件管理工具--total commander
查看>>
react-01
查看>>
sublime插件安装
查看>>
SetForegroundWindow
查看>>
数据库存储系统应用,超市小票系统
查看>>
Git
查看>>
DB Change
查看>>
nginx --rhel6.5
查看>>
Eclipse Python插件 PyDev
查看>>
selenium+python3模拟键盘实现粘贴、复制
查看>>
第一篇博客
查看>>
typeof与instanceof的区别
查看>>
网站搭建(一)
查看>>
SDWebImage源码解读之SDWebImageDownloaderOperation
查看>>
elastaticsearch
查看>>
postgreSQL 简单命令操作
查看>>