网络流/贪心

网络流做法是对于每一列,如果一个兔子下一天继续可以存在,那么连一条容量为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. Java图形界面GUI

    Java图形界面GUI 设置窗体JFrame对象 package com.Aha.Best; import javax.swing.ImageIcon; import javax.swing.JFra ...

  2. 迷宫自动生成以及基于DFS的自动寻路算法

    直接贴代码 #include<ctime> #include<conio.h> #include<iostream> #include<windows.h&g ...

  3. TestNG参数化测试

    参数化有两种方法: 第一种:在xml文件中声明 第二种:用@DataProvider注解 先介绍第一种方法: ParameterTest类:用@Parameters({"name" ...

  4. 使用yolo3模型训练自己的数据集

    使用yolo3模型训练自己的数据集 本项目地址:https://github.com/Cw-zero/Retrain-yolo3 一.运行环境 1. Ubuntu16.04. 2. TensorFlo ...

  5. with一个对象,自动触发__enter__方法

    class Foo(object): def __init__(self): pass def __enter__(self): print("__enter__") def __ ...

  6. Linux系统重要的子目录

    更多目录知识  http://blog.51cto.com/yangrong/1288072 /etc/fstab 机自动挂载分区/磁盘,规定哪个分区/设备,挂载到哪里 [root@oldboy ~] ...

  7. 转来的——python webdriver自动化测试初步印象——转来的

    python webdriver自动化测试初步印象 以下示例演示启动firefox,浏览google.com,搜索Cheese,等待搜索结果,然后打印出搜索结果页的标题 from selenium i ...

  8. JAVA之文件操作1,2,3,4

    package first_program; import java.io.File; import java.io.IOException; public class num_1v { public ...

  9. ModelMap org.springframework.ui.ModelMap

    ModelMap实现了map接口,可以在其中存放属性,作用域同request,同时可与@SessionAttributes联合使用,把数据放入到session中去, 下面这个示例,我们可以在Model ...

  10. jQuery WeUI 组件下拉刷新和滚动加载的实现

    最近在做手机版使用到了下拉刷新和滚动加载,记录一下实现过程: 一.引入文件 ? 1 2 3 4 <link rel="stylesheet" href="Conte ...