CodeForces - 589F(贪心+二分)
题意:
一个美食家来吃晚宴,有n道菜,每道菜上菜的时间和收盘子的时间分别是ai和bi,美食家想每道菜都吃,并且每道菜时间相同(吃一道菜的时间可以不连续),而且美食家每秒只能吃一道菜,问美食家吃菜最长的时间是多少。
思路:
先贪心,每次先吃收盘子最早的菜,这样影响最小,所以每道菜按bi有小到大排。再二分每道菜的吃的时间x,必须每道都吃,这答案n*x。
判断是否有x时间吃完这道菜,直接遍历每道菜的时间,并且这段时间前面没有用到(这里可以用数组标记下),每道都可以就时间往更大搜,不可以就往小搜。
代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; struct node{ int a,b; }s[150]; int ans,n; int vis[10050]; bool cmp(node a1,node a2)//按bi从小到大排 { if(a1.b!=a2.b) return a1.b<a2.b; return a1.a<a2.a; } bool jug(int x)//判断每道菜x秒是否可行 { memset(vis,0,sizeof(vis));//记录时间,是否访问 for(int i=0;i<n;i++) { int sum=0; for(int j=s[i].a;j<s[i].b;j++) { if(sum==x) break; if(!vis[j]) { sum++; vis[j]=1; } } if(sum<x)//时间不够,则不行 return false; } return true;//时间够 } int solve()//二分每道菜的时间 { int l=0,r=10000; while(l<=r) { int mid=(l+r)/2; if(jug(mid)) { ans=mid; l=mid+1; } else r=mid-1; } return ans; } int main() { ans=0; cin>>n; for(int i=0;i<n;i++) cin>>s[i].a>>s[i].b; sort(s,s+n,cmp); cout<<n*solve()<<endl; return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 上周热点回顾(1.20-1.26)
· 【译】.NET 升级助手现在支持升级到集中式包管理