3661: Hungry Rabbit

Time Limit: 100 Sec  Memory Limit: 512 MBSec  Special Judge
Submit: 67  Solved: 47

Description

可怕的洪水在夏天不期而至,兔子王国遭遇了前所未有的饥荒,它们不得不去外面的森林里寻找食物。
为了简化起见,我们假设兔子王国中有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
0111

Sample Output

2 3 4
2 3 4
3 4 5
2 3 5

HINT

对于 100% 的测试数据,1 <= n;m <= 800; 1 <= k <= n; 1 <= l <= k

Source

 
【分析】
  
  唉、、、我打了网络流,70分。。。【其实数据弱恰好我数组开小本来90分的。。
  说说我的网络流打法吧,毕竟想了很久。
  就是1100011的兔子可以看成两只1100000、0000011的兔子。
  然后就是说每个兔子表示一个区间,表示它可以从l~r这几天工作。
  就是要找若干个区间覆盖全区间k次。
  就类似这样子的建图:
  
  拆点那里的点容限制了<=L次交换。反向INF表示区间相交求并集。然后判断是否满流就是否有解。
  然后有意义的表示区间的边就是答案,输出即可。【好像输出答案有点困难啊??
 
  然后正解是贪心!【表示考场上想过不知道为什么脑抽觉得n^2log过不了???【黑人问号???
  就是每次贪心找尽量长的区间。。。
  有优先队列维护,每次用最优的更新最差的看看是否成立即可。
 
 #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 (贪心、优先队列)的更多相关文章

  1. 【BZOJ3661】Hungry Rabbit 贪心

    [BZOJ3661]Hungry Rabbit Description 可怕的洪水在夏天不期而至,兔子王国遭遇了前所未有的饥荒,它们不得不去外面的森林里寻找食物.为了简化起见,我们假设兔子王国中有n只 ...

  2. hihoCoder 1309:任务分配 贪心 优先队列

    #1309 : 任务分配 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定 N 项任务的起至时间( S1, E1 ), ( S2, E2 ), ..., ( SN,  ...

  3. UVA 11134 - Fabled Rooks(贪心+优先队列)

    We would like to place  n  rooks, 1 ≤  n  ≤ 5000, on a  n×n  board subject to the following restrict ...

  4. 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 ...

  5. HDU 6438 网络赛 Buy and Resell(贪心 + 优先队列)题解

    思路:维护一个递增队列,如果当天的w比队首大,那么我们给收益增加 w - q.top(),这里的意思可以理解为w对总收益的贡献而不是真正获利的具体数额,这样我们就能求出最大收益.注意一下,如果w对收益 ...

  6. Hungry Rabbit

    Problem C. Hungry Rabbit Input file: hungry.in Output file: hungry.out Time limit: 10 seconds Memory ...

  7. 贪心+优先队列 HDOJ 5360 Hiking

    题目传送门 /* 题意:求邀请顺序使得去爬山的人最多,每个人有去的条件 贪心+优先队列:首先按照l和r从小到大排序,每一次将当前人数相同的被邀请者入队,那么只要能当前人数比最多人数条件小,该人能 被邀 ...

  8. [POJ1456]Supermarket(贪心 + 优先队列 || 并查集)

    传送门 1.贪心 + 优先队列 按照时间排序从前往后 很简单不多说 ——代码 #include <queue> #include <cstdio> #include <i ...

  9. Painting The Fence(贪心+优先队列)

    Painting The Fence(贪心+优先队列) 题目大意:给 m 种数字,一共 n 个,从前往后填,相同的数字最多 k 个在一起,输出构造方案,没有则输出"-1". 解题思 ...

随机推荐

  1. Request爬取网站(seo.chinaz.com)百度权重的查询结果

    一:脚本需求 利用Python3查询网站权重并自动存储在本地数据库(Mysql数据库)中,同时导出一份网站权重查询结果的EXCEL表格 数据库类型:MySql 数据库表单名称:website_weig ...

  2. Shiro认证的另一种方式

    今天在学习shiro的时候使用另一种shiro验证的方式. 总体的思路是: (1)先在自己的方法中进行身份的验证以及给出提示信息.(前提是将自己的验证方法设为匿名可访问) (2)当验证成功之后到Shi ...

  3. MVVM模式View和ViewModel的通信

    还需要些什么呢 在前面几篇博客中我们尝试去实现了MVVM中的数据绑定.命令绑定和事件绑定.貌似实现的差不多了.我最早尝试用MVVM去开发的时候也是这么想的,没有用第三方框架,甚至只是实现了数据绑定和命 ...

  4. C基础 旋转数组查找题目

    前言 - 引言 题目: 一类有序数组旋转查值问题. 例如: 有序数组 [ , , , , , , , , ] 旋转后为 [ , , , , , , , , ] 如何从中找出一个值索引, not fou ...

  5. linux文件管理 -> vim编辑总结

    vi和vim命令是linux中强大的文本编辑器, 由于Linux系统一切皆文件,而配置一个服务就是在修改其配置文件的参数.vim编辑器是运维工程师必须掌握的一个工具, 没有它很多工作都无法完成.vim ...

  6. Mac 升级一次,php 就崩溃一次,有味,苹果....

    Mac升级系统macOS Sierra后PHP不编译 Mac下搭建PHP开发环境(Apache+PHP+MySQL+phpMyAdmin),当Mac 从OS 10.11升级至macOS Sierra( ...

  7. log4j与commons-logging slf4j的关系

    1. slf4j     他只提供一个核心slf4j api(就是slf4j-api.jar包),这个包只有日志的接口并没有实现     所以如果要使用就得再给它提供一个实现了些接口的日志包,     ...

  8. xgboost gbdt特征点分烈点

    lightGBM与XGBoost的区别:(来源于:http://baijiahao.baidu.com/s?id=1588002707760744935&wfr=spider&for= ...

  9. 你竟然在公钥中下毒!——如何在RSA公钥中添加后门

    原文:http://www.hackdig.com/?01/hack-17893.htm 分享到: 当我知道它是如何运行时,我惊得下巴都掉了.这是一个非常简单的手法,但这篇文章会颠覆你之前对RSA的看 ...

  10. No.6 selenium学习之路之下拉框Select

    HTML中,标签显示为select,有option下拉属性的为Select弹框 1.Xpath定位 Xpath语法,顺序是从1开始,编程语言中是0开始