专栏文章
题解:P14635 [NOIP2025] 糖果店 / candy(民间数据)
P14635题解参与者 6已保存评论 6
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @mimytltv
- 此快照首次捕获于
- 2025/12/01 17:47 3 个月前
- 此快照最后确认于
- 2025/12/01 17:47 3 个月前
简化问题
先思考简化的问题,再推广到原问题,可以根据数据特殊性质来简化。
买多少个都是一样的,所以直接全买最小的即可。
可以理解为“第二份降价”,那么肯定两个两个买,两个两个买谁呢?就买 最小的,买到买不起为止。
然后手上还会剩钱,由于当前的钱连最便宜的一对糖果都买不起,所以肯定只能买单个的,于是对所有 排序,从便宜到贵买,直到买不起。
然后手上还会剩钱,由于当前的钱连最便宜的一对糖果都买不起,所以肯定只能买单个的,于是对所有 排序,从便宜到贵买,直到买不起。
正解
根据以上两份简化,可以得到:最多一种糖果买的个数 。
先计算 表示最便宜一对糖的价格(即 )。
先计算 表示最便宜一对糖的价格(即 )。
然后对 排序,从小到大买(只买一个,也就只消耗 ),对于每个 计算已经单个买了 个糖果,然后全部买 能买多少个即可。
实现的时间复杂度为 ,空间复杂度为 ,时间瓶颈在排序。
细节
如果买不起就离开,不要让你的钱变成负数。
参考代码
CPP#include <bits/stdc++.h>
#define rep(i,l,r) for(int i=(l);i<=(r);i++)
using namespace std;
typedef long long ll;
const int N=1e5+10;
ll n,m;
ll x[N],y[N];
signed main(){
cin>>n>>m;
rep(i,1,n)cin>>x[i]>>y[i];
rep(i,1,n)y[i]+=x[i];
sort(x+1,x+1+n);
ll d=*min_element(y+1,y+1+n);
ll ans=0;
rep(i,1,n){
ans=max(ans,m/d*2+(i-1)); //已经买了 i-1 个单只糖果,剩下的钱全买成对的d
m-=x[i];
if(m<0)break;
}
if(m>=0)ans=max(ans,m/d*2+n);
cout<<ans;
}
相关推荐
评论
共 6 条评论,欢迎与作者交流。
正在加载评论...