BZOJ2621 [Usaco2012 Mar]Cows in a Skyscraper

首先比较容易想到是状态压缩DP

令$f[S]$表示选取了集合$S$以后,已经送了最少次数cnt且当前电梯剩下的体积rest最大(即$f[S]$是一个二元组(cnt, rest))

于是$f[S] = min_{i \in S} f[S - {i}] + v[i]$

$<$和$+$运算详情就请看程序好了,反正就是一个贪心思想,总复杂度$O(n * 2 ^ {n - 1})$

 1 /**************************************************************
 2     Problem: 2621
 3     User: rausen
 4     Language: C++
 5     Result: Accepted
 6     Time:532 ms
 7     Memory:13092 kb
 8 ****************************************************************/
 9
10 #include <cstdio>
11 #include <algorithm>
12
13 using namespace std;
14 const int N = 20;
15 const int S = 1 << N;
16 const int inf = 1e9;
17
18 int n, mx, mxs;
19 int a[S];
20
21 struct data {
22     int cnt, rest;
23     data(int _c = 0, int _r = mx) : cnt(_c), rest(_r) {}
24
25     inline data operator + (int t) const {
26         static data res;
27         res = *this;
28         res.rest -= t;
29         if (res.rest < 0) ++res.cnt, res.rest += mx;
30         return res;
31     }
32
33     inline bool operator < (const data &d) const {
34         return cnt == d.cnt ? rest < d.rest : cnt < d.cnt;
35     }
36 } f[S];
37
38 int main() {
39     int i, s, t, now;
40     scanf("%d%d", &n, &mx);
41     mxs = (1 << n) - 1;
42     for (i = 1; i <= n; ++i) scanf("%d", &a[1 << i - 1]);
43     f[0] = data(0, mx);
44     for (s = 1; s <= mxs; ++s) {
45         t = s, f[s] = data(inf, mx);
46         while (t) {
47             now = t & (-t);
48             f[s] = min(f[s], f[s ^ now] + a[now]);
49             t -= now;
50         }
51     }
52     printf("%d\n", f[mxs].cnt + (f[mxs].rest != mx));
53     return 0;
54 }
55 

时间: 2024-11-10 00:57:12

BZOJ2621 [Usaco2012 Mar]Cows in a Skyscraper的相关文章

2620: [Usaco2012 Mar]Haybale Restacking

2620: [Usaco2012 Mar]Haybale Restacking Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 201  Solved: 111[Submit][Status][Discuss] Description Farmer John has just ordered a large number of bales of hay. He would like to organize these into N piles (1

P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper [模拟退火]

P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper 给出n个物品,体积为w[i],现把其分成若干组,要求每组总体积<=W,问最小分组.(n<=18) 想状压dp正解是不可能的,这辈子都不可能的 如果物品的分组是连续的,那么就是个小学组问题了:直接遍历贪心搞即可. 据说还有dp方法:\(dp[i]\)为前\(i\)个物品的最小分组,如果某段区间的和大于\(W\),那么就转移一下.利用前缀和并不难写. 像这道题这种无序分组的问题,其实可以通过各种打乱顺序化

【题解】Luogu P3052 【USACO12】摩天大楼里的奶牛Cows in a Skyscraper

迭代加深搜索基础 题目描述 A little known fact about Bessie and friends is that they love stair climbing races. A better known fact is that cows really don’t like going down stairs. So after the cows finish racing to the top of their favorite skyscraper, they had

[USACO12MAR] 摩天大楼里的奶牛 Cows in a Skyscraper

题目描述 A little known fact about Bessie and friends is that they love stair climbing races. A better known fact is that cows really don't like going down stairs. So after the cows finish racing to the top of their favorite skyscraper, they had a proble

P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper

题目描述 给出n个物品,体积为w[i],现把其分成若干组,要求每组总体积<=W,问最小分组.(n<=18) 输入格式: Line 1: N and W separated by a space. Lines 2..1+N: Line i+1 contains the integer C_i, giving the weight of one of the cows. 输出格式: Line 1: A single integer, R, indicating the minimum number

BZOJ2620 [Usaco2012 Mar]Haybale Restacking

恩,非常好的题...至少思路非常巧妙 首先可以得到性质:对于相邻的两堆A & B,A给B然后B再给A是完全没有意义的...也就是说只能单向传递 然后我们记下每个点要给(被给)多少堆干草a[i] 同时可以计算出del[i],表示若第i堆只向右传且第n堆不向第1堆运任何干草的情况下i - 1向i传递干草的数量 del[i] = del[i - 1] + a[i - 1](其实就是前缀和) 现在1可以向右移了,设向右移x堆,则ans = Σabs(del[i] - x) 故x = mid(del +

[luoguP3052] [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper(DP)

传送门 输出被阉割了. 只输出最少分的组数即可. f 数组为结构体 f[S].cnt 表示集合 S 最少的分组数 f[S].v 表示集合 S 最少分组数下当前组所用的最少容量 f[S] = min(f[S], f[S - i] + a[i]) (i ∈ S) 运算重载一下即可. ——代码 1 #include <cstdio> 2 #include <iostream> 3 4 int n, m, w; 5 int a[19]; 6 struct qwq 7 { 8 int cnt

洛谷3258:[USACO2012 MAR]Flowerpot 花盆——题解

https://www.luogu.org/problemnew/show/P2698#sub 老板需要你帮忙浇花.给出N滴水的坐标,y表示水滴的高度,x表示它下落到x轴的位置. 每滴水以每秒1个单位长度的速度下落.你需要把花盆放在x轴上的某个位置,使得从被花盆接着的第1滴水开始,到被花盆接着的最后1滴水结束,之间的时间差至少为D. 我们认为,只要水滴落到x轴上,与花盆的边沿对齐,就认为被接住.给出N滴水的坐标和D的大小,请算出最小的花盆的宽度W. 单调队列好题,参考洛谷题解. emm……显然是

动态规划之子集枚举

子集枚举DP P3959 宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了\(n\)个深埋在地下的宝藏屋, 也给出了这\(n\)个宝藏屋之间可供开发的\(m\)条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中的宝藏.但是,每个宝藏屋距离地面都很远, 也就是说,从地面打通一条到某个宝藏屋的道路是很困难的,而开发宝藏屋之间的道路 则相对容易很多. 小明的决心感动了考古挖掘的赞助商,赞助商决定免费赞助他打通一条从地面到某 个宝藏屋的通道,通往哪个宝藏屋则由小明来决定. 在此基础