P3052 [USACO12MAR] Cows in a Skyscraper G

发布于:2025-02-20 ⋅ 阅读:(24) ⋅ 点赞:(0)

网址如下:

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做,但是我还不太会


网站公告

今日签到

点亮在社区的每一天
去签到