uva 11134 Fabled Roo
2015-09-23 10:21
274 查看
题意:n*n的棋盘上放n辆车,任意两辆不互相攻击,并且第i俩在给定的矩形内
题解:用贪心做,每次尽量放左边的坐标,如果是纵坐标则尽量放下方的坐标,然后不断进行更新操作即可。
题解:用贪心做,每次尽量放左边的坐标,如果是纵坐标则尽量放下方的坐标,然后不断进行更新操作即可。
#include<cstdio> #include<cstring> #include<iostream> #include<queue> #include<algorithm> using namespace std; const int maxn=50001; struct point { int l; int r; int pos; friend bool operator < (const point& a,const point& b) { if(a.l==b.l) return a.r>b.r; return a.l>b.l; } }a[maxn],b[maxn]; priority_queue<point> qa,qb; int ansa[maxn],ansb[maxn]; int main() { int n; while(scanf("%d",&n)&&n) { for(int i=0;i<n;i++) { scanf("%d%d%d%d",&a[i].l,&b[i].l,&a[i].r,&b[i].r); a[i].pos=b[i].pos=i; qa.push(a[i]); qb.push(b[i]); } int flag=0,maxi=0; while(!qa.empty()) { point ita=qa.top(); qa.pop(); if(ita.r<maxi) { flag=1; while(!qa.empty()) qa.pop(); break; } if(ita.l<maxi) { ita.l=maxi; qa.push(ita); continue; } maxi=max(maxi,ita.l); ansa[ita.pos]=maxi; maxi++; } if(!flag) { maxi=0; while(!qb.empty()) { point ita=qb.top(); qb.pop(); if(ita.r<maxi) { flag=1; while(!qb.empty()) qb.pop(); break; } if(ita.l<maxi) { ita.l=maxi; qb.push(ita); continue; } maxi=max(maxi,ita.l); ansb[ita.pos]=maxi; maxi++; } } if(flag) printf("IMPOSSIBLE\n"); else { for(int i=0;i<n;i++) printf("%d %d\n",ansa[i],ansb[i]); } } return 0; }
相关文章推荐
- MySQL 存储4个字节 java.sql.SQLException: Incorrect string value: '\...' at row 1
- springMVC教程初级(四)Controller篇(结果、参数 )
- SQL Convert(Datetime) 日期转换
- IDL在气象中的应用
- Latex学习笔记:整体认识
- tinyxml源码解析(上)
- js浏览器问题
- 类的静态成员
- 验证Xcode真伪的方法,来自苹果官网
- System.currentTimeMillis()获得当前时间
- 键值观察者的使用及注意事项
- android学习:通过Intent打开Activity的两种方法,Intent过滤器的使用方法
- 8月国内网民上网时间无明显变化 21点出现峰值
- DataGridView 列宽设置
- linux 安装问题make: 没有指明目标并且找不到makefile。 停止
- RAID磁盘阵列中LUN的理解
- LeetCode OJ8 String to Integer (atoi) 小结
- Yoshua Bengio等大神传授:26条深度学习经验
- IAR常用快捷键和使用小技巧
- sublime Text2 必备插件(SASS SCSS)