[二分答案 贪心] BZOJ 3248 [ioi2013]robots
来源:互联网 发布:我的世界安卓版js 编辑:程序博客网 时间:2024/05/22 17:02
考虑二分答案,这样只需检验m分钟内是否可以把所有玩具收拾好。
将每个玩具i与坐标(W[i]:重量, S[i]:体积)对应,这样每个弱机器人可以收拾某一横坐标以左的玩具,每个小机器人可以收拾某一纵坐标以下的玩具。
从右至左添加这些玩具,一旦某一时刻某个弱机器人可以收拾当前玩具,则它可以收拾之后的所有玩具。因此我们应尽量保留弱机器人,即优先使用小机器人。
将每个玩具i与坐标(W[i]:重量, S[i]:体积)对应,这样每个弱机器人可以收拾某一横坐标以左的玩具,每个小机器人可以收拾某一纵坐标以下的玩具。
从右至左添加这些玩具,一旦某一时刻某个弱机器人可以收拾当前玩具,则它可以收拾之后的所有玩具。因此我们应尽量保留弱机器人,即优先使用小机器人。
选择小机器人时,当然应该优先选择可以收拾当前玩具的小机器人中,Y[i]值最小的一个。
这样,我们便有了检验可行性的贪心策略。
实现时可以借助C++ STL中的set完成。
时间复杂度为O(N*log2N)。
#include<cstdio>#include<cstdlib>#include<algorithm>#include<functional>using namespace std;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; if (p1==p2) { p2=(p1=buf)+fread(buf,1,100000,stdin); if (p1==p2) return EOF; } return *p1++;}inline void read(int &x){ char c=nc(),b=1; for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1; for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b;}const int N=1000005;const int AB=50005;struct abcd{int x,y;abcd(int x=0,int y=0):x(x),y(y) { }bool operator < (const abcd &B) const{return x==B.x?y>B.y:x>B.x;}};int n,A,B,ans;abcd P[N];int lx[AB],ly[AB];int cntx[AB],cnty[AB];int fat[AB];inline void init(){for (int i=1;i<=B+1;i++) fat[i]=i;}inline int Fat(int u){return u==fat[u]?u:fat[u]=Fat(fat[u]);}inline bool check(int mid){init(); int iter,pnt=A;for (int i=1;i<=A;i++) cntx[i]=0;for (int i=1;i<=B;i++) cnty[i]=0;for (int i=1;i<=n;i++){iter=upper_bound(ly+1,ly+B+1,P[i].y)-ly;iter=Fat(iter);if (iter!=B+1){cnty[iter]++;if (cnty[iter]==mid) fat[iter]=iter+1;}else{if (pnt==0 || P[i].x>=lx[pnt]) return 0;cntx[pnt]++;if (cntx[pnt]==mid) pnt--;}}return 1;}inline int Bin(){ int L=0,R=n,MID; while (L+1<R) if (check(MID=(L+R)>>1)) R=MID; else L=MID; return R;}int main(){ int maxx=0,maxy=0; freopen("robots.in","r",stdin); freopen("robots.out","w",stdout); read(A); read(B); read(n); for (int i=1;i<=A;i++) read(lx[i]),maxx=max(maxx,lx[i]); for (int i=1;i<=B;i++) read(ly[i]),maxy=max(maxy,ly[i]); sort(lx+1,lx+A+1); sort(ly+1,ly+B+1); for (int i=1;i<=n;i++){ read(P[i].x),read(P[i].y); if (P[i].x>=maxx && P[i].y>=maxy) return printf("-1\n"),0; } sort(P+1,P+n+1); ans=Bin(); printf("%d\n",ans); return 0;}
0 0
- [二分答案 贪心] BZOJ 3248 [ioi2013]robots
- BZOJ 2097 Exercise 奶牛健美操 二分答案+树形DP+贪心
- BZOJ 2525 Poi2011 Dynamite 二分答案+树形贪心
- BZOJ 2067 POI 2004 SZN 树形DP 贪心 二分答案
- bzoj 3969 WF2013 Low Power [贪心] [二分答案]
- [贪心 模拟 + 二分答案 DP] BZOJ 1181 [CROATIAN2009]IZBROI选举
- bzoj 2525: [Poi2011]Dynamite 二分答案+树形贪心
- bzoj 3613: [Heoi2014]南园满地堆轻絮 二分答案+贪心
- 【BZOJ】3246 [Ioi2013]Dreaming
- bzoj 3246: [Ioi2013]Dreaming
- 【jzoj4932】【贪心】【二分答案】
- 数学题 贪心+二分答案
- poj3122 二分答案+贪心
- bzoj 2016 二分答案
- BZOJ-5090 (二分答案)
- bzoj 3246 [Ioi2013] Dreaming 题解
- BZOJ 2097 USACO 2010 Dec Gold Exercise 奶牛健美操 二分答案 树形DP 贪心
- bzoj 2097: [Usaco2010 Dec]Exercise 奶牛健美操 (二分答案+贪心)
- Stroyboard 拖线弹出选项
- Mysql命令大全
- ubuntu用apt-get install 安装软件遇到的问题
- js中用prototype实现继承
- 源码分析 --- 系统进程Zygote启动过程
- [二分答案 贪心] BZOJ 3248 [ioi2013]robots
- 设置 view 的透明度
- 面试题17:合并两个有序链表,递归和非递归实现
- UE4 学习笔记(1)——如何用VS进行UE4的Debug
- eclipse 的opencv第一次学习
- 使用Quagga测试Neutron BGP动态路由(by quqi99)
- servlet 获取 post body 体 (用流读取为空的问题)
- HDU 5335 BFS
- android 控制控件的位置和大小