5.贪心
贪心
开题顺序:
[AGC032E] Modulo Pairing
-
若没有
的限制,将 升序排序后取第 大和第 小进行匹配,调整法即可证明。- 以
为例,由 ,可知 。
- 以
-
类似 [ABC353C] Sigma Problem ,加上
的限制后一定会被一个分界点分成左右两部分,左右两部分分别取第 大和第 小进行匹配。- 证明仍考虑调整法,假设
。 任意两数相加的和 的情况同上。- 不妨假设
。 - 若
,显然有 。 - 若
,显然有 。
- 证明仍考虑调整法,假设
-
在满足右边条件的限制下分界点越靠左越好,二分判断即可。
点击查看代码
ll a[200010]; bool check(ll mid,ll n,ll m) { for(ll i=mid+1,j=n;i<=j;i++,j--) { if(a[i]+a[j]<m) { return false; } } return true; } int main() { // #define Isaac #ifdef Isaac freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif ll n,m,ans=0,l,r,mid,pos=0,i,j; cin>>n>>m; n*=2; l=0; r=n/2; for(i=1;i<=n;i++) { cin>>a[i]; } sort(a+1,a+1+n); while(l<=r) { mid=(l+r)/2; if(check(mid*2,n,m)==true) { pos=mid*2; r=mid-1; } else { l=mid+1; } } for(i=1,j=pos;i<=j;i++,j--) { ans=max(ans,a[i]+a[j]); } for(i=pos+1,j=n;i<=j;i++,j--) { ans=max(ans,a[i]+a[j]-m); } cout<<ans<<endl; return 0; }
luogu P3265 [JLOI2015] 装备购买
luogu P1484 种树
-
反悔贪心板子。
点击查看代码
priority_queue<pair<ll,ll> >q; ll a[300010],pre[300010],suf[300010],vis[300010]; int main() { // #define Isaac #ifdef Isaac freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif ll n,k,ans=0,pos,i; cin>>n>>k; for(i=1;i<=n;i++) { cin>>a[i]; pre[i]=i-1; suf[i]=i+1; q.push(make_pair(a[i],i)); } a[0]=a[n+1]=-0x3f3f3f3f; for(i=1;i<=k;i++) { while(q.empty()==0&&vis[q.top().second]==1) { q.pop(); } if(q.empty()==0) { if(q.top().first<=0) { break; } ans+=q.top().first; pos=q.top().second; q.pop(); vis[pre[pos]]=vis[suf[pos]]=1; a[pos]=a[pre[pos]]+a[suf[pos]]-a[pos]; q.push(make_pair(a[pos],pos)); pre[pos]=pre[pre[pos]]; suf[pos]=suf[suf[pos]]; pre[suf[pos]]=suf[pre[pos]]=pos; } } cout<<ans<<endl; return 0; }
CF335F Buy One, Get One Free
-
考虑最大化白嫖的馅饼价格总和。
-
通过样例
可知,不断拿最大白嫖次大的贪心策略是假的,考虑反悔贪心维护白嫖物品的集合 。 -
不妨把同样价格的馅饼缩在一起处理。并按照价格从大到小进行处理,此时白嫖只能依赖先前的状态。
-
设当前价格为
,数量为 ,之前一共得到了 个馅饼且有 个馅饼是通过白嫖得到的。 -
此时可以白嫖
个馅饼,而剩下 个物品需要全价购买。 -
尝试开始反悔,设当前取出的小根堆堆顶为
并弹出,由反悔贪心决策的替换性我们无法直接得知 的大小关系。- 设
的来源是 ,每两个馅饼一起考虑。 - 若
,我们可以用原来用来白嫖 的机会替换成白嫖 ,同时购买 ,又因为此时 的来源是一个比 大的馅饼,故一共可以获得两次白嫖机会,将 个 加入 。 - 若
,存在两种决策:购买 ,白嫖 个 ,代价为 ;购买 和 个 ,仍白嫖 ,代价为 。这两个决策是互斥的,故将 加入 。
- 设
-
为避免自己白嫖自己的情况,中间需要用数组转存一下加入集合
的价格。点击查看代码
ll a[500010],b[500010],cnt[500010]; vector<ll>tmp; priority_queue<ll,vector<ll>,greater<ll> >q; int main() { // #define Isaac #ifdef Isaac freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif ll n,ans=0,sum=0,tot,val,i,j; cin>>n; for(i=1;i<=n;i++) { cin>>a[i]; b[i]=a[i]; ans+=a[i]; } sort(b+1,b+1+n); b[0]=unique(b+1,b+1+n)-(b+1); for(i=1;i<=n;i++) { cnt[lower_bound(b+1,b+1+b[0],a[i])-b]++; } for(i=b[0];i>=1;i--) { tot=min(sum-2*(ll)q.size(),cnt[i]); for(j=1;j<=tot;j++) { tmp.push_back(b[i]); } tot=cnt[i]-tot; for(j=1;j<=tot&&q.empty()==0;j+=2) { val=q.top(); q.pop(); if(b[i]>val) { tmp.push_back(b[i]); if(j+1<=tot) { tmp.push_back(b[i]); } } else { tmp.push_back(val); if(j+1<=tot&&2*b[i]-val>0) { tmp.push_back(2*b[i]-val); } } } while(tmp.empty()==0) { q.push(tmp.back()); tmp.pop_back(); } sum+=cnt[i]; } while(q.empty()==0) { ans-=q.top(); q.pop(); } cout<<ans<<endl; return 0; }
[AGC010C] Cleaning
luogu P9293 [ROI 2018] Addition without carry
LibreOJ 560. 「LibreOJ Round #9」Menci 的序列
luogu P4053 [JSOI2007] 建筑抢修
-
按照
排序后在保证抢修建筑最多的情况下花费时间最少,使用优先队列存储先前最大的 支持撤销。点击查看代码
pair<ll,ll>a[150010]; priority_queue<ll>q; int main() { // #define Isaac #ifdef Isaac freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif ll n,ans=0,sum=0,i; cin>>n; for(i=1;i<=n;i++) { cin>>a[i].second>>a[i].first; } sort(a+1,a+1+n); for(i=1;i<=n;i++) { if(sum+a[i].second<=a[i].first) { sum+=a[i].second; ans++; q.push(a[i].second); } else { if(q.empty()==0&&q.top()>=a[i].second) { sum+=a[i].second-q.top(); q.pop(); q.push(a[i].second); } } } cout<<ans<<endl; return 0; }
luogu P3620 [APIO/CTSC2007] 数据备份
-
多倍经验: SP1553 BACKUP - Backup Files | CF958E2 Guard Duty (medium)
-
每个办公楼显然只能和相邻的两个办公楼连接,且不能同时连接。
-
然后和 luogu P1484 种树 一样做即可。
点击查看代码
ll a[100010],b[100010],pre[100010],suf[100010],vis[100010]; priority_queue<pair<ll,ll>,vector<pair<ll,ll> >,greater<pair<ll,ll> > >q; int main() { // #define Isaac #ifdef Isaac freopen("in.in","r",stdin); freopen("out.out","w",stdout); #endif ll n,k,ans=0,pos,i; cin>>n>>k; for(i=1;i<=n;i++) { cin>>a[i]; } for(i=1;i<=n-1;i++) { b[i]=a[i+1]-a[i]; pre[i]=i-1; suf[i]=i+1; q.push(make_pair(b[i],i)); } b[0]=b[n]=0x7f7f7f7f; for(i=1;i<=k;i++) { while(q.empty()==0&&vis[q.top().second]==1) { q.pop(); } if(q.empty()==0) { ans+=q.top().first; pos=q.top().second; q.pop(); vis[pre[pos]]=vis[suf[pos]]=1; b[pos]=b[pre[pos]]+b[suf[pos]]-b[pos]; q.push(make_pair(b[pos],pos)); pre[pos]=pre[pre[pos]]; suf[pos]=suf[suf[pos]]; suf[pre[pos]]=pre[suf[pos]]=pos; } } cout<<ans<<endl; return 0; }
[AGC008B] Contiguous Repainting
本文来自博客园,作者:hzoi_Shadow,原文链接:https://www.cnblogs.com/The-Shadow-Dragon/p/18650825,未经允许严禁转载。
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下