网络流/贪心

网络流做法是对于每一列,如果一个兔子下一天继续可以存在,那么连一条容量为1的边,然后设立一个中转站,来控制可以换的数量,容量限制l。时限100s,能跑过去我的太慢了,一个点100s

正解是贪心。不会证明。每一只兔子,我们当然希望能够尽量连续多跑几天,给其他兔子留机会。每次把在的兔子和不在的兔子排序,具体程序,然后看前l个能不能交换。

巨慢无比的网络流

#include<bits/stdc++.h>
using namespace std;
const int N = * , inf = << ;
struct edge {
int nxt, to, f;
} e[N * ];
int n, m, k, l, S1, T, S, cnt = ;
int q[N * + ], d[N * + ], head[N * + ], iter[N * + ];
int a[][], b[][];
#define id(i, j) (i - 1) * m + j
inline void link(int u, int v, int f)
{
e[++cnt].nxt = head[u];
head[u] = cnt;
e[cnt].to = v;
e[cnt].f = f;
}
inline void ins(int u, int v, int f)
{
link(u, v, f);
link(v, u, );
}
bool bfs()
{
int l = , r = ;
q[++r] = ;
memset(d, , sizeof(d));
d[] = ;
while(l <= r)
{
int u = q[l++];
for(int i = head[u]; i; i = e[i].nxt) if(e[i].f && !d[e[i].to])
{
d[e[i].to] = d[u] + ;
if(e[i].to == T) return ;
q[++r] = e[i].to;
}
}
return ;
}
int dfs(int u, int delta)
{
if(u == T)
return delta;
int ret = ;
for(int &i = iter[u]; i && delta; i = e[i].nxt) if(e[i].f && d[e[i].to] == d[u] + )
{
int x = dfs(e[i].to, min(delta, e[i].f));
e[i].f -= x;
e[i ^ ].f += x;
ret += x;
delta -= x;
}
d[u] = ;
return ret;
}
inline int dinic()
{
int ret = ;
while(bfs())
{
for(int i = ; i <= T; ++i)
iter[i] = head[i];
ret += dfs(, inf);
}
return ret;
}
void build()
{
T = n * m + N * + m * + ;
S1 = n * m + N * + m * + ;
ins(, S1, k);
for(int i = ; i <= n; ++i)
for(int j = ; j <= m; ++j) if(a[i][j])
{
ins(id(i, j), id(i, j) + N, );
b[i][j] = cnt - ;
}
for(int i = ; i <= n; ++i)
{
if(a[i][])
ins(S1, id(i, ), );
if(a[i][m])
ins(id(i, m) + N, T, );
}
for(int j = ; j <= m; ++j)
ins(n * m + N * + j, n * m + N * + j + m, l);
for(int i = ; i <= n; ++i)
for(int j = ; j <= m; ++j) if(a[i][j])
{
if(j < m)
if(a[i][j + ])
ins(id(i, j) + N, id(i, j + ), );
if(j < m)
ins(id(i, j) + N, n * m + N * + j + , );
if(j > )
ins(n * m + N * + j + m, id(i, j), );
}
}
int main()
{
// freopen("input.txt", "r", stdin);
scanf("%d%d%d%d", &n, &m, &k, &l);
for(int i = ; i <= n; ++i)
{
char s[]; scanf("%s", s + );
for(int j = ; j <= m; ++j)
a[i][j] = s[j] - '';
}
build();
int ans = dinic();
if(ans < k)
{
puts("-1");
return ;
}
for(int j = ; j <= m; ++j)
{
for(int i = ; i <= n; ++i)
if(b[i][j])
if(e[b[i][j]].f == )
printf("%d ", i);
puts("");
}
// fclose(stdin);
return ;
}

贪心

#include<bits/stdc++.h>
using namespace std;
const int N = * , inf = << ;
int n, m, k, l;
typedef pair<int, int> PII;
int pos[][], a[][], mark[];
PII b[][], c[][];
bool cp1(PII x, PII y)
{
return x.first < y.first;
}
bool cp2(PII x, PII y)
{
return x.first > y.first;
}
int main()
{
scanf("%d%d%d%d", &n, &m, &k, &l);
for(int i = ; i <= n; ++i)
{
char s[]; scanf("%s", s + );
for(int j = ; j <= m; ++j)
a[i][j] = s[j] - '';
}
for(int j = ; j <= m; ++j)
for(int i = ; i <= n; ++i) if(a[i][j])
{
int Pos = j;
b[j][i] = c[j][i] = make_pair(, i);
while(a[i][Pos + ])
{
++Pos;
++b[j][i].first;
++c[j][i].first;
}
}
sort(b[] + , b[] + n + , cp2);
for(int i = ; i <= k; ++i)
if(b[][i].first > )
pos[][++pos[][]] = b[][i].second;
if(pos[][] < k)
{
puts("-1");
return ;
}
sort(pos[] + , pos[] + k + );
for(int i = ; i <= k; ++i)
printf("%d ", pos[][i]);
puts("");
for(int j = ; j <= m; ++j)
{
memset(mark, , sizeof(mark));
for(int i = ; i <= k; ++i)
mark[pos[j - ][i]] = ;
for(int i = ; i <= n; ++i)
if(mark[i])
c[j][i].first = -;
else
b[j][i].first = inf;
sort(b[j] + , b[j] + n + , cp1);
sort(c[j] + , c[j] + n + , cp2);
for(int i = ; i <= l; ++i)
if(b[j][i].first < c[j][i].first)
pos[j][i] = c[j][i].second;
else
pos[j][i] = b[j][i].second;
for(int i = l + ; i <= k; ++i)
pos[j][i] = b[j][i].second;
sort(pos[j] + , pos[j] + k + );
for(int i = ; i <= k; ++i)
printf("%d ", pos[j][i]);
puts("");
}
return ;
}

bzoj3661的更多相关文章

  1. 【BZOJ3661】Hungry Rabbit 贪心

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

随机推荐

  1. linux 系统 UDP 丢包问题分析思路

    转自:http://cizixs.com/2018/01/13/linux-udp-packet-drop-debug?hmsr=toutiao.io&utm_medium=toutiao.i ...

  2. Extjs二级联动combo省城市

    Extjs二级联动 Extjs combox根据省查询城市 实现效果如上图所示, store层代码: Ext.define("ExtApp.store.TeacherProvince&quo ...

  3. ubuntu安装nvidia驱动以及cuda教程

    最近尝试在ubuntu中安装nvidia的显卡驱动以及cuda.花了近三天时间,真的如网上所说错误百出,期间甚至重装了一次ubuntu系统,搞到怀疑人生,整个都是泪- -.最终经过百般“磨难”总算安装 ...

  4. Gym - 101670E Forest Picture (CTU Open Contest 2017 模拟)

    题目: https://cn.vjudge.net/problem/1451310/origin 题意&思路: 纯粹模拟. 大体题意是这样的: 1.有人要在一个10-9<=x<=1 ...

  5. MyBatis 中 resultMap 详解

    resultMap 是 Mybatis 最强大的元素之一,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中.如在实际应用中,有一个表为(用户角色表),通过查询用户表信息展示页面, ...

  6. JSP页面中的动作标识

    JSP页面中的动作标识 制作人:全心全意 包含文件标识<jsp:include> 此标识和include指令类似,用于向当前页面中包含其它的文件,且包含的文件可以是动态文件,也可以是静态文 ...

  7. React组件设计技巧

    React组件设计 组件分类 展示组件和容器组件 展示组件 容器组件 关注事物的展示 关注事物如何工作 可能包含展示和容器组件,并且一般会有DOM标签和css样式 可能包含展示和容器组件,并且不会有D ...

  8. python爬虫28 | 你爬下的数据不分析一波可就亏了啊,使用python进行数据可视化

    通过这段时间 小帅b教你从抓包开始 到数据爬取 到数据解析 再到数据存储 相信你已经能抓取大部分你想爬取的网站数据了 恭喜恭喜 但是 数据抓取下来 要好好分析一波 最好的方式就是把数据进行可视化 这样 ...

  9. Jmeter学习笔记之逻辑控制器-Runtime Controller

    文章目录 Runtime Controller介绍 Runtime Controller 编辑界面 Once Only Controller介绍 Once Only Controller 配置界面 O ...

  10. OS X中crt中文乱码

    SecureCRT中显示乱码的话,可以去设置为UTF-8编码: Session Options->Terminal->Appearance->Character Encoding,设 ...