社区讨论

问AI才知道贪心错了,求估分 : (

P14635[NOIP2025] 糖果店参与者 6已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@mioejrsc
此快照首次捕获于
2025/12/02 17:55
3 个月前
此快照最后确认于
2025/12/04 13:50
3 个月前
查看原帖

第一次参加 NOIP 虽然知道难度超纲好多,当时以为要做出第一题好兴奋,唯独第六个样例是 83 我怎么做都是 82 就没管它,回来跑洛谷自测 100 分真的以为自己出息了 (强省弱市里的蒟蒻孩儿),问了AI才发现贪心策略就不对,突然当头一棒呜呜呜。不知道 CCF 数据强度怎么样……不知道还有没有二三等奖。 ·悲哀·

CPP
#include <bits/stdc++.h>
#include <queue>
using namespace std;
typedef long long ll;

int main() {
    ll n, m, min_two = LONG_LONG_MAX, cnt = 0;
    cin >> n >> m;
    vector<pair<ll, ll>> vec(n + 1);
    vector<bool> sign(n + 1, false);
    for (ll i = 1; i <= n; i++) {
        cin >> vec[i].first >> vec[i].second;
        min_two = min(min_two, vec[i].first + vec[i].second);
    }
    for (ll i = 1; i <= n; i++) {
        if (vec[i].first * 2 <= min_two) {
            m -= vec[i].first;
            cnt++;
            sign[i] = true;
        }
    }

    cnt += m / min_two * 2;
    m %= min_two;

    priority_queue<ll, vector<ll>, greater<ll>> pq;

    for (ll i = 1; i <= n; i++) {
        if (!sign[i] && vec[i].first <= m) {
            // m -= vec[i].first;
            // cnt++;
            pq.push(vec[i].first);
        }
        if (sign[i] && vec[i].second <= m) {
            // m -= vec[i].second;
            // cnt++;
            pq.push(vec[i].second);
        }
    }

    while (!pq.empty() && m - pq.top() >= 0) {
        m -= pq.top();
        pq.pop();
        cnt++;
    }

    cout << cnt << endl;
}

回复

8 条回复,欢迎继续交流。

正在加载回复...