专栏文章

题解:P14635 [NOIP2025] 糖果店 / candy

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

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@mimyslpz
此快照首次捕获于
2025/12/01 17:46
3 个月前
此快照最后确认于
2025/12/01 17:46
3 个月前
查看原文
这道题目就两个字:贪心。
显然先选 xi+yix_i + y_i 最小的糖果,但是这只是其中一部分,花在这里的钱有一部分应该在其他糖果的 xix_i 上,但一定不会花到其他糖果的 yiy_i,每次把花在 xi+yix_i + y_i 的钱取出一部分到糖果的 xix_i 身上,就可以了。
具体见代码。
CPP
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5 + 5;
int n, x[N], y[N];
ll ans, ansy, minn = 1e10, sum, m;
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin >> n >> m;
    for(int i = 1;i <= n;i++){
    	cin >> x[i] >> y[i];
        //找最小的每一组糖果的价格
    	if(x[i] + y[i] < minn){
    		minn = x[i] + y[i];
		}
	}
    //先算当前的 ans,但不是最优的
	ans = m / minn * 2, m %= minn, ansy = ans;
    //选x[i]的时候显然要从小的买
	sort(x + 1, x + n + 1);
	for(int i = 1;i <= n;i++){
		sum += x[i];
		ll th;
		//算买价格 sum 的糖果要退回多少个 minn
		if(m >= sum) th = 0;
		else if((sum - m) % minn == 0) th = (sum - m) / minn;
		else th = (sum - m) / minn + 1;
		//更新 ans 看会不会更优 
		if(th <= ans * 2 && ans - th * 2 + i > ansy){
			ansy = ans - th * 2 + i;
		}
	}
	cout << ansy;
	return 0;
}

评论

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

正在加载评论...