CF1671C Dolce Vita 题解
题目大意
摘自洛谷的翻译:
动乱的时代就要来了,因此你决定储备一些糖。有 个商店卖糖:第 个商店一包糖要 硬币,但每人每天只能买一包。所以你为了买多几包糖,你得去好几家商店。
另外一个问题就是糖价每天都在上涨:第一天 硬币一包,第二天 硬币一包,第三天 硬币一包。对于每家商店都是如此。
然而,你每天的预算只有 硬币。也就是说,你每天花在糖上的钱不能超过 硬币。如果你一天的预算没有花完,第二天也不能花前一天剩下来的钱。
最终,每包糖的价格都会超过 ,你将一包糖都买不起。所以,在那之前,你最多能买多少包糖?
题目解析
不难想到每天肯定买便宜的糖,由于每天所有糖涨价的速度是一样的,所以相对的大小不会变。
所以首先我们需要排序。
然后直接暴力做显然是不可行的。
我们可以先做一次前缀和,枚举 从 到 ,然后直接二分出最小的 使得第 天不买不起 包糖。
复杂度 。
参考代码:
void work(){ n=read(); x=read(); int i; for(i=1;i<=n;i++) a[i]=read(); sort(a+1,a+n+1); ans=0; for(i=1;i<=n;i++) a[i]+=a[i-1]; for(i=1;i<=n;i++){ l=-1,r=x+10; while(l+1<r){ mid=(l+r)>>1; if(a[i]+(ll)mid*(ll)i<=x) l=mid; else r=mid; } ans+=l+1; } print(ans),pc('\n'); }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析