【BZOJ 3661】 Hungry Rabbit (贪心、优先队列)
3661: Hungry Rabbit
Time Limit: 100 Sec Memory Limit: 512 MBSec Special Judge
Submit: 67 Solved: 47Description
可怕的洪水在夏天不期而至,兔子王国遭遇了前所未有的饥荒,它们不得不去外面的森林里寻找食物。
为了简化起见,我们假设兔子王国中有n只兔子,编号为1n。在救济粮到来之前的m天中,每天恰好有k只兔子需要去森林里寻找粮食。森林里居住着可怕的大灰狼,所幸兔子已经摸清了大灰狼捕食习惯,即狼们在每一天只会捕食特定编号的兔子。为了安全起见,兔子们需要保证每次出去觅食的k只兔子都不会被狼捕食。由于每天出去捕食的兔子都不尽相同,它们为每一天定义了一个生疏度pi,即第i天出来寻找食物,但是第i1天却没有出来觅食的兔子个数。规定第1天的生疏度为0.现在兔子们希望在保证安全的前提下,每天的生疏度不能超过L,请为兔子们构造一个合法的方案。Input
第一行包括四个整数n,m,k和L.
接下来n行,每行一个长度为m的01串。其中第i行第j个字符若为0,则表示狼在第j天会捕食编号为i的兔子,为1则表示不捕食。Output
m行,每行k个1-n之间互不相同的整数,代表这一天出去寻找食物的兔子编号。如果没有合法方案,则输出一行1即可。
Sample Input
5 4 3 1
1001
1101
1111
1110
0111Sample Output
2 3 4
2 3 4
3 4 5
2 3 5HINT
对于 100% 的测试数据,1 <= n;m <= 800; 1 <= k <= n; 1 <= l <= k
Source

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define Maxn 810
#define INF 0xfffffff struct node
{
int l,r,id;
}t[Maxn*Maxn];
struct cmp{bool operator()(node x,node y){return x.r<y.r;}};
struct cmp2{bool operator()(node x,node y){return x.r>y.r;}};
// bool cmp(node x,node y) {return x.r>y.r;}
// bool cmp2(node x,node y) {return x.r<y.r;}
bool cmp3(node x,node y) {return x.l<y.l;}
priority_queue<node,vector<node>,cmp> q1;
priority_queue<node,vector<node>,cmp2> q2; char s[Maxn]; bool vis[Maxn];
int op[Maxn][Maxn];
int main()
{
// int T;
// scanf("%d",&T);
// while(T--)
{
int n,m,k,l;
scanf("%d%d%d%d",&n,&m,&k,&l); int cnt=,id;
for(int i=;i<=n;i++)
{
scanf("%s",s+);
for(int j=;j<=m;j++)
{
if((j==||s[j-]=='')&&s[j]=='') id=j;
else if(j!=&&s[j-]==''&&s[j]=='') t[++cnt].l=id,t[cnt].r=j-,t[cnt].id=i;
if(s[j]==''&&j==m) t[++cnt].l=id,t[cnt].r=m,t[cnt].id=i;
}
}
sort(t+,t++cnt,cmp3);
// int qz=0;
while(!q1.empty()) q1.pop();
while(!q2.empty()) q2.pop();
int nw=;
bool ok=;
memset(vis,,sizeof(vis));
for(int i=;i<=m;i++)
{
int hh=;
while(t[nw+].l<=i&&nw<cnt) q1.push(t[++nw]);
while(!q2.empty()&&q2.top().r<i) {vis[q2.top().id]=;q2.pop();}
while(q2.size()<k)
{
if(q1.empty()||q1.top().r<i) {ok=;break;}
vis[q1.top().id]=;
q2.push(q1.top());q1.pop();
hh++;
if(hh>l&&i!=) break;
}
if((hh>l&&i!=)||!ok) {ok=;break;}
while(hh<l&&!q1.empty()&&q1.top().r>q2.top().r)
{
hh++;
vis[q2.top().id]=;
q2.pop();
vis[q1.top().id]=;
q2.push(q1.top());q1.pop();
}
op[i][]=;
for(int j=;j<=n;j++) if(vis[j]) op[i][++op[i][]]=j;
}
if(!ok) printf("1\n");
else
{
for(int i=;i<=m;i++)
{
for(int j=;j<=op[i][];j++) printf("%d ",op[i][j]);
printf("\n");
}
}
}
return ;
}
2017-04-24 20:03:42
【BZOJ 3661】 Hungry Rabbit (贪心、优先队列)的更多相关文章
- 【BZOJ3661】Hungry Rabbit 贪心
		
[BZOJ3661]Hungry Rabbit Description 可怕的洪水在夏天不期而至,兔子王国遭遇了前所未有的饥荒,它们不得不去外面的森林里寻找食物.为了简化起见,我们假设兔子王国中有n只 ...
 - hihoCoder 1309:任务分配 贪心 优先队列
		
#1309 : 任务分配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定 N 项任务的起至时间( S1, E1 ), ( S2, E2 ), ..., ( SN, ...
 - UVA 11134 - Fabled Rooks(贪心+优先队列)
		
We would like to place n rooks, 1 ≤ n ≤ 5000, on a n×n board subject to the following restrict ...
 - C. Playlist     Educational Codeforces Round 62 (Rated for Div. 2)  贪心+优先队列
		
C. Playlist time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...
 - HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解
		
思路:维护一个递增队列,如果当天的w比队首大,那么我们给收益增加 w - q.top(),这里的意思可以理解为w对总收益的贡献而不是真正获利的具体数额,这样我们就能求出最大收益.注意一下,如果w对收益 ...
 - Hungry Rabbit
		
Problem C. Hungry Rabbit Input file: hungry.in Output file: hungry.out Time limit: 10 seconds Memory ...
 - 贪心+优先队列 HDOJ 5360 Hiking
		
题目传送门 /* 题意:求邀请顺序使得去爬山的人最多,每个人有去的条件 贪心+优先队列:首先按照l和r从小到大排序,每一次将当前人数相同的被邀请者入队,那么只要能当前人数比最多人数条件小,该人能 被邀 ...
 - [POJ1456]Supermarket(贪心 + 优先队列 || 并查集)
		
传送门 1.贪心 + 优先队列 按照时间排序从前往后 很简单不多说 ——代码 #include <queue> #include <cstdio> #include <i ...
 - Painting The Fence(贪心+优先队列)
		
Painting The Fence(贪心+优先队列) 题目大意:给 m 种数字,一共 n 个,从前往后填,相同的数字最多 k 个在一起,输出构造方案,没有则输出"-1". 解题思 ...
 
随机推荐
- Shell基础-Bash命令类型
			
Bash命令大体可以分为两类: 第一类是可执行文件,例如ls等 第二类是Bash内建命令,常见echo,cd等 bash命令优先级表:1别名 由alias指定 2关键字 3函数 由function ...
 - Linux的基础优化
			
归结成口诀: 一清.一精.一增.两优.四设.七其他 一清: 定时清理日志 一精: 精简开机启动服务 一增: 增大文件描述符 两优: linux内核参数的优化.yum源优化 四设:设置系统的字符集.设置 ...
 - 《区块链100问》第82集:应用类项目Golem
			
Golem是第一个基于以太坊区块链打造的计算资源交易平台.通过区块链,Golem能链接全球的算力资源,从而实现计算能力的全球共享.应用所有者和个体用户(算力“请求方”)可以点对点地从其他用户处租用算力 ...
 - 信息安全学习笔记--XSS
			
一.XSS简介 XSS (Cross Site Scripting)是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中.比如这些代码包括HTML代 ...
 - gpio口、内核定时器使用
			
/*申请gpio*/ int gpio_request(unsigned gpio, const char *label); /*设置gpio为输入状态,即设置如(GPH0CON)*/ int gpi ...
 - Ubuntu server 搭建Git server【转】
			
转自:http://www.cnblogs.com/candle806/p/4064610.html Ubuntu server 搭建Git server,git相比svn,最主要就是分布式了,每个客 ...
 - mysql insert锁机制【转】
			
最近再找一些MySQL锁表原因,整理出来一部分sql语句会锁表的,方便查阅,整理的不是很全,都是工作中碰到的,会持续更新 笔者能力有限,如果有不正确的,或者不到位的地方,还请大家指出来,方便你我,方便 ...
 - SQL-如果指定值存在返回1,如果不存在返回0的SQL语句
			
想实现简单的判断一个表中是否有一条记录,可以用这个方式.如以下,table_name是表名,column1是列名. 这条语句会在此条记录存在的时候返回1,不存在时返回0. FROM table_nam ...
 - 移动端,PC端,微信等常用平台和浏览器判断
			
var wzw={ //浏览器相关信息 //android webview 需要app进行支持,Android web view初始化时,在navigator中添加标识 browser:{ versi ...
 - IntelliJ IDEA 去除IDE自动的参数名 提示功能