【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". 解题思 ...
随机推荐
- HTTP请求方法 之 HEAD
HTTP请求方法并不是只有GET和POST,只是最常用的.据RFC2616标准(现行的HTTP/1.1)得知,通常有以下8种方法:OPTIONS.GET.HEAD.POST.PUT.DELETE.TR ...
- ES6简单总结
1.变量声明let和const 我们都是知道在ES6以前,var关键字声明变量.无论声明在何处,都会被视为声明在函数的最顶部(不在函数内即在全局作用域的最顶部).这就是函数变量提升例如: functi ...
- socket系统调用
SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol) { int retval; struct socket *sock; in ...
- Awk基础
Awk文本处理 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.awk数据可以来自标准输入.一个或多个文件,或其它命令的输出.awk通常是配合脚本进行使用, 是一个强大的文本处 ...
- mac 删除垃圾篓中的文件
1.打开终端输入: sudo rm -rf /Volumes/kaid/.Trashes/ 2.输入本机密码
- python基础--类的经典类vs新式类
经典类VS新式类区别 1)写法新式类class Person(object):#new style 经典类class Persion: #classical style 2)调用父类 新式写法用sup ...
- rsync + inotify 实时同步
1. 前言 2 台 nginx 需要做集群, 静态文件和php文件都在nginx服务器本地. 有三种方案: (1)NFS (2)Rsync + inotify (3)共享存储服务器 第一种:当 nfs ...
- java基础40 可变参数、自动装箱和自动拆箱
一.可变参数 可变参数是jdk1.5新特性 1.1.可变参数的格式 数据类型...变量名 // 数据类型...变量名public static void sum(int...arr){ } 1.2.可 ...
- MyEclipse自带且常用的快捷键和自己定义的快捷键方法步骤
1.MyEclipse自带且常用的快捷键 内容提示(补全): Alt+/ 导包快捷键: Ctrl+Shift+o 格式化代码: Ctrl+Shift+f 行代码位置上下调换: Alt ...
- UVA 10891 Game of Sum(区间DP(记忆化搜索))
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...