网址如下:
P3052 [USACO12MAR] Cows in a Skyscraper G - 洛谷
(题意翻译中的wi改成ci)
好久没写博客了,寒假加入校队,高强度刷题,感觉懒得写,寒假前倒是写了一个关于虚拟机共用宿主机的VPN的博客的,结果没过审,只能说对翻墙管的是真严啊
后面寒假了就只顾着爽玩了,没怎么刷题(中途还被我姐拉去写pyhon搞数据,算是增长经验)
关于这道题:
刚开始直接用贪心干的,结果贪心思路有问题,加上使用STL过度,直接TLE+WA了:
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;bool cmp(const int &e, const int &val){return e >= val;}int main(void)
{vector<int> vec;int n, w; scanf("%d%d", &n, &w);for(int i = 0; i < n; i++){int val; scanf("%d", &val);vec.push_back(val);}sort(vec.begin(), vec.end(), cmp);int cnt = 0, val = 0;while(!vec.empty()){auto it = lower_bound(vec.begin(), vec.end(), val, cmp);if(it == vec.end()){cnt++; val = w;}else{val = val - *it; vec.erase(it);}}printf("%d", cnt);return 0;
}
后面是改成二分查找答案:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;const int maxn = 20;
int c[maxn], n, w;
int u[maxn];bool cmp(const int &e, const int &val){return e >= val;}
bool dfs(int cur, int d){if(cur == n) return true;for(int i = 0; i < d; i++)if(u[i] + c[cur] <= w){u[i] += c[cur];if(dfs(cur + 1, d)) return true;u[i] -= c[cur];}return false;
}int main(void)
{scanf("%d%d", &n, &w);int l = 0, r = n;for(int i = 0; i < n; i++){scanf("%d", &c[i]); l += c[i];}sort(c, c + n, cmp);l = l / w;while(l < r){int mid = (l + r) >> 1; memset(u, 0, sizeof(u));if(dfs(0, mid)) r = mid; else l = mid + 1;}printf("%d", l);return 0;
}
这道题也可以用状压dp做,但是我还不太会