BZOJ1605 [Usaco2008 Open]Crisis on the Farm 牧场危机

标题好长&&我是权限狗,汪汪!

题没看懂的我以为这是一道极难滴题目。。。然后,然后我就看懂题了。

数据少给了一个条件K <= 30...(没这条件还做个鬼。。。)

f[k, i, j]表示走了k步,x方向移动i,y方向移动j的最大被拯救牛的数量,然后方程就很好写了,略之。

(其实是太烦了,不想写)

真是一道很烦的题目。。。不仅预处理很烦,转移很烦,连输出解也很烦。。。

 1 /**************************************************************
 2     Problem: 1605
 3     User: rausen
 4     Language: C++
 5     Result: Accepted
 6     Time:76 ms
 7     Memory:1644 kb
 8 ****************************************************************/
 9
10 #include <cstdio>
11 #include <algorithm>
12
13 #define rep(i, n) for (int (i) = 1; (i) <= (n); ++(i))
14 using namespace std;
15 const int dx[5] = {0, 1, 0, 0, -1};
16 const int dy[5] = {0, 0, 1, -1, 0};
17 const int inf = (int) 1e9;
18 const char CHAR[5] = {‘A‘, ‘W‘, ‘S‘, ‘N‘, ‘E‘};
19 int n, m, K, ans;
20 int Cx[1500], Cy[1500], Hx[1500], Hy[1500];
21 int f[40][64][64], cnt[64][64];
22 char step[40][64][64];
23
24 int main(){
25     scanf("%d%d%d", &n, &m, &K);
26     rep(i, n)
27         scanf("%d%d", Cx + i, Cy + i);
28     rep(i, m)
29         scanf("%d%d", Hx + i, Hy + i);
30     rep(i, n) rep(j, m){
31         int Dx = Cx[i] - Hx[j], Dy = Cy[i] - Hy[j];
32         if (abs(Dx) <= 30 && abs(Dy) <= 30)
33             ++cnt[31 + Dx][31 + Dy];
34     }
35     for (int k = 0; k <= K; ++k)
36         for (int i = 0; i <= 62; ++i)
37             for (int j = 0; j <= 62; ++j){
38                 f[k][i][j] = -inf;
39                 step[k][i][j] = ‘Z‘;
40             }
41     f[0][31][31] = 0;
42
43     rep(k, K) rep(i, 61)    rep(j, 61)
44         f[k][i][j] = cnt[i][j] + max(max(f[k - 1][i - 1][j], f[k - 1][i + 1][j]), max(f[k - 1][i][j - 1], f[k - 1][i][j + 1]));
45     ans = 0;
46     rep(i, 61) rep(j, 61)
47         ans = max(ans, f[K][i][j]);
48     rep(i, 61) rep(j, 61)
49         if (f[K][i][j] == ans)
50             step[K][i][j] = ‘A‘;
51     for (int k = K - 1; k >= 0; --k)
52         rep(i, 61) rep(j, 61) rep(l, 4)
53             if (f[k][i][j] + cnt[i + dx[l]][j + dy[l]] == f[k + 1][i + dx[l]][j + dy[l]] && step[k + 1][i + dx[l]][j + dy[l]] < ‘Z‘)
54                 step[k][i][j] = CHAR[l];
55
56     printf("%d\n", ans);
57     int i = 31, j = 31;
58     for (int k = 0; k < K; ++k){
59         printf("%c", step[k][i][j]);
60         if (step[k][i][j] == ‘E‘) --i; else
61         if (step[k][i][j] == ‘W‘) ++i; else
62         if (step[k][i][j] == ‘S‘) ++j; else
63         if (step[k][i][j] == ‘N‘) --j;
64     }
65     printf("\n");
66     return 0;
67 }

比某些斜率优化还长。。。

时间: 2024-08-02 02:51:20

BZOJ1605 [Usaco2008 Open]Crisis on the Farm 牧场危机的相关文章

BZOJ 1605 [Usaco2008 Open]Crisis on the Farm 牧场危机:dp【找转移路径】

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1605 题意: 平面直角坐标系中,有n个点,m个标记(坐标范围1~1000). 你可以发出口令,让所有点整体向东.南.西.北四个方向中的任意一个方向移动,口令分别记作'E','S','W','N'. 每当一个点碰到一个标记,则答案+1.(保证初始时没有点在标记上) 你最多可以发出t次口令. 问你答案最大是多少,并输出字典序最小的口令序列. 题解: 表示状态: dp[i][j][k] = m

洛谷 P2905 [USACO08OPEN]农场危机Crisis on the Farm(恶心的DP)

P2905 [USACO08OPEN]农场危机Crisis on the Farm 1605: [Usaco2008 Open]Crisis on the Farm 牧场危机 题目描述 约翰和他的奶牛组建了一只乐队“后街奶牛”,现在他们正在牧场里排练.奶牛们分成一堆 一堆,共1000)堆.每一堆里,30只奶牛一只踩在另一只的背上,叠成一座牛塔.牧场 里还有M(1 < M < 1000)个高高的草垛. 作为出色的指挥家,约翰可以通过口哨指挥奶牛们移动.他的口哨有四个音,分别能使所有 的牛塔向东南

洛谷P2905 [USACO08OPEN]农场危机Crisis on the Farm

P2905 [USACO08OPEN]农场危机Crisis on the Farm 题目描述 约翰和他的奶牛组建了一只乐队“后街奶牛”,现在他们正在牧场里排练.奶牛们分成一堆 一堆,共1000)堆.每一堆里,30只奶牛一只踩在另一只的背上,叠成一座牛塔.牧场 里还有M(1 < M < 1000)个高高的草垛. 作为出色的指挥家,约翰可以通过口哨指挥奶牛们移动.他的口哨有四个音,分别能使所有 的牛塔向东南西北四个方向移动一格. 每一次,当一个牛塔到达了一个草垛所在的格子,牛塔最上方的奶牛就会跳到

bzoj1621[Usaco2008 Open]Roads Around The Farm分岔路口*

bzoj1621[Usaco2008 Open]Roads Around The Farm分岔路口 题意: n头牛在路上走,每当它们走到岔路,如果这些牛可以分为数量相差刚好为k的两群,那么它们就会分成这样的两群往前走,否则就会停下来吃草.问最后有多少群在吃草.n≤10^9,k≤1000. 题解: 暴力模拟.(好像实际上不管有多少只牛只要经过3.4个岔路后就会无法再分并停下来吃草) 代码: 1 #include <cstdio> 2 int n,k,ans; 3 void dfs(int n,i

bzoj:1621: [Usaco2008 Open]Roads Around The Farm分岔路口

Description 约翰的N(1≤N≤1,000,000,000)只奶牛要出发去探索牧场四周的土地.她们将沿着一条路走,一直走到三岔路口(可以认为所有的路口都是这样的).这时候,这一群奶牛可能会分成两群,分别沿着接下来的两条路继续走.如果她们再次走到三岔路口,那么仍有可能继续分裂成两群继续走.    奶牛的分裂方式十分古怪:如果这一群奶牛可以精确地分成两部分,这两部分的牛数恰好相差K(1≤K≤1000),那么在三岔路口牛群就会分裂.否则,牛群不会分裂,她们都将在这里待下去,平静地吃草.   

[Usaco2008 Open]Roads Around The Farm分岔路口[水题]

Description 约翰的N(1≤N≤1,000,000,000)只奶牛要出发去探索牧场四周的土地.她们将沿着一条路走,一直走到三岔路口(可以认为所有的路口都是这样的).这时候,这一群奶牛可能会分成两群,分别沿着接下来的两条路继续走.如果她们再次走到三岔路口,那么仍有可能继续分裂成两群继续走.    奶牛的分裂方式十分古怪:如果这一群奶牛可以精确地分成两部分,这两部分的牛数恰好相差K(1≤K≤1000),那么在三岔路口牛群就会分裂.否则,牛群不会分裂,她们都将在这里待下去,平静地吃草.   

洛谷 P2905 [USACO08OPEN]农场危机Crisis on the Farm

题目描述 约翰和他的奶牛组建了一只乐队“后街奶牛”,现在他们正在牧场里排练.奶牛们分成一堆 一堆,共1000)堆.每一堆里,30只奶牛一只踩在另一只的背上,叠成一座牛塔.牧场 里还有M(1 < M < 1000)个高高的草垛. 作为出色的指挥家,约翰可以通过口哨指挥奶牛们移动.他的口哨有四个音,分别能使所有 的牛塔向东南西北四个方向移动一格. 每一次,当一个牛塔到达了一个草垛所在的格子,牛塔最上方的奶牛就会跳到草垛上,而且 不再下来,而其他奶牛仍然呈塔状站在草垛所在的格子里.当牛塔只剩一只奶牛

BZOJ 1621 [Usaco2008 Open]Roads Around The Farm分岔路口:分治 递归

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1621 题意: 约翰的N(1≤N≤1,000,000,000)只奶牛要出发去探索牧场四周的土地. 她们将沿着一条路走,一直走到三岔路口(可以认为所有的路口都是这样的). 这时候,这一群奶牛可能会分成两群,分别沿着接下来的两条路继续走. 如果她们再次走到三岔路口,那么仍有可能继续分裂成两群继续走. 奶牛的分裂方式十分古怪:如果这一群奶牛可以精确地分成两部分,这两部分的牛数恰好相差K(1≤K≤

【USACO 2008 Open Gold】 2.Crisis on the Farm 动规、

题意:输入n.m.p然后是n头牛塔坐标.m个草垛坐标,有p次指令机会. 每次指令可以向上下左右其中一种方向,让所有牛塔都移动一单位. 然后每经过草垛/牛塔次,就有1个权值. 求权值最大值及使权值最大的移动指令序列(字典序最小). 题解:f[i][j][k]表示第i次,移动序列x轴坐标为j,y轴k,最大权值. 然后倒着做以保证字典序. 代码: #include <cstdio> #include <cstring> #include <iostream> #include