网络流/贪心

网络流做法是对于每一列,如果一个兔子下一天继续可以存在,那么连一条容量为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. nginx+keepalived+tomcat+memcache实现双VIP高可用及Session会话保持

    Nginx+Keepalived+Tomcat+Memcached 实现双VIP负载均衡及Session会话保持 IP 信息列表: 名称         IP                      ...

  2. win10 javac无效

    win10配置环境变量时,要写绝对路径,不再需要写JAVA_HOME和classpaht,直接在pass上添加全路径就可以了.

  3. python多进程和多线程编程

    17 多线程和多进程并发 The modules described in this chapter provide support for concurrent execution of code. ...

  4. CentOS7.x的DNS服务的基础配置

    一.bind服务器安装 bind:开源.稳定.应用广泛的DNS服务.bind的软件包名bind,服务名称named. 查看是否安装bind, 安装bind包: rpm -qa bind yum -y ...

  5. tomcat配置虚拟目录实现无项目名访问项目,域名直接访问

    1.tomcat下新建文件夹名为 myapp,把编译后的项目放入该文件夹,不是war包. 2.conf/Catalina/localhost目录下,新建一个ROOT.xml文件,写入类似于如下内容 & ...

  6. nyoj 63 小猴子下落

    小猴子下落 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 有一颗二叉树,最大深度为D,且所有叶子的深度都相同.所有结点从左到右从上到下的编号为1,2,3,····· ...

  7. How to automate PowerPoint using VB

    Microsoft has an article that explains how to automate PowerPoint using VB For some odd reason they' ...

  8. Happy 2006 欧几里得定理

    Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 11956   Accepted: 4224 Descr ...

  9. NOIP2015 提高组合集

    NOIP 2015 提高组 合集 D1 T1 神奇的幻方 题目让你干啥你就干啥,让你咋走你就咋走就完事儿了 #include <iostream> #include <cstdio& ...

  10. bzoj——2982: combination

    2982: combination Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 611  Solved: 368[Submit][Status][Di ...