BZOJ3523: [Poi2014]Bricks
2016-05-12 14:44
441 查看
题目大意:给你每种颜色的砖块数量,相同颜色的砖块不能放在一起,两头颜色已经确定,构造一种方案
很容易想到是贪心,哪种颜色剩下的多就优先放那种颜色,多个颜色数量相同优先放结尾的那种颜色,实在放不了了就无解
很容易想到是贪心,哪种颜色剩下的多就优先放那种颜色,多个颜色数量相同优先放结尾的那种颜色,实在放不了了就无解
#include<iostream> #include<cstdio> #include<queue> #define N 1000010 using namespace std; struct ppp{int w,c;}; int st,en; bool operator <(ppp x,ppp y) { if(x.w!=y.w) return x.w<y.w; if(x.c==en) return false; return true; } priority_queue<ppp>q; int ans ; int main() { int n; scanf("%d%d%d",&n,&st,&en); int i,j,x,y,m=0; ppp t,tmp; for(i=1;i<=n;i++) { scanf("%d",&t.w); m+=t.w; t.c=i; if(i==st) t.w--; if(i==en) t.w--; if(t.w<0) {puts("0");return 0;} q.push(t); } ans[1]=st;ans[m]=en; bool f; for(i=2;i<m;i++) { t=q.top();f=false; q.pop(); if(t.c==st) { tmp=t; if(!q.empty()) t=q.top(); else {puts("0");return 0;} q.pop(); f=true; } st=ans[i]=t.c; if(t.w>1) q.push((ppp){t.w-1,t.c}); if(f) q.push(tmp); } if(ans[m-1]==ans[m]) {puts("0");return 0;} for(i=1;i<=m;i++) printf("%d ",ans[i]); }
相关文章推荐
- [NSConcreteNotification objectForKey:]: unrecognized selector sent to instan
- 面试笔试题5--大整数表示问题?
- Linux高级编程--06.进程概述
- 关于SpringMvc中使用aop的问题
- c#的DateTime.Now函数详解
- tomcat发布项目如何去掉项目名称
- Swift HTTP GET请求例子
- ReactNative js判断android还是ios
- 表空间2
- UniversalImageLoader源码解读07-内存泄漏和bug
- Postgres数据库在Linux中优化
- thinkphp框架下404页面设置
- Linux高级编程--05.文件读写
- Java的8大排序算法
- 微信分享功能开发
- .addClass(),.removeClass(),.toggleClass()的区别
- Oracle rownum和rowid
- piccaso(二)内部缓存及优化
- <xhtml>简略描述
- Fatal Error[e72]: Segment FIQ_STACK must be defined in a segment definition option (-Z, -b or -P)