专栏文章

P14635 题解

P14635题解参与者 1已保存评论 0

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@mimyipjw
此快照首次捕获于
2025/12/01 17:38
3 个月前
此快照最后确认于
2025/12/01 17:38
3 个月前
查看原文
如果两个两个买,买奇数价偶数价之和最小的一定最优。
剩下的就只能买一个了,于是偶数价都没用了,问题变成:有一个商品 cc,给定价格,价值是 22,可以买无限个;还有 nn 个商品 aia_i,给定价格,价值是 11 ,每个只能买一个,求 mm 元钱最多买到多少价值的商品?
剩下的就是简单的贪心了。把所有 aia_i 从小到大排序,维护前缀和,枚举买 11nn 个商品 aa 时能买几个商品 cc
最重点的是判 m<sumim<sum_i 的情况。钱得够才能更新,这不是很显然嘛?但是在考场上貌似就不显然了。加上 CCF 脚造的感人大样例全 AC,想都没想就美滋滋以为自己 A 了。现在只能祈祷官方数据一样脚造了。
然后就没了。想明白之后真的没多难,代码比 club 短老多了。但我感觉这题场上难度绝对有绿,一是思考难度不亚于去年 T1,二是大样例过水导致很多错解未被 hack。
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;

int a[100005], b[100005], c[100005], sum[100005];
int n, m, ans;

signed main() {
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> a[i] >> b[i];
        c[i] = a[i] + b[i];
    }
    sort(c + 1, c + 1 + n);
    sort(a + 1, a + 1 + n);
    for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] + a[i];
    for (int i = 0; i <= n; i++) {
        if (m >= sum[i]) ans = max(ans, i + ((m - sum[i]) / c[1]) * 2);
// 只有在总钱数足够的时候才更新
    }
    cout << ans << endl;
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...