给定一个圆形蛋糕,被 条切割线分成 个扇形蛋糕块,按照顺时针编号,第 块上有 个草莓,第 条切割线到第 条切割线之间的部分是第 块蛋糕。
Alice 和 Bob 流选择切割线,假设 Alice 选择了第 条切割线,Bob选择了第 条切割线, 不能等于 。则 Alice 获得从第 条切割线顺时针到第 条切割线之间的蛋糕,Bob获得剩余蛋糕。Alice 的平均草莓数若大于等于 Bob 的平均草莓数,则 Alice 获胜,否则 Bob 获胜。求使 Alice 必胜的最小切割线编号,不存在则输出 。
第一行一个正整数
。
第二行 个正整数 表示第 块内的草莓数量。
一个整数,即为答案。
Alice 在 和 之间切一刀,Alice要么会拿到 要么会拿到 和 ,都可以获胜。
对于所有数据 。
对于 的数据 。
对于 的数据无特殊限制。
可将每个 转化为其与所有数字的平均值之间的差,对新的 做前缀和,则当 Alice 选 ,Bob 选 时,如 ,则 Alice 胜。故 Alice 应选 最小的点后面的切割线,此时无论 Bob 如何选择都必败。
游乐园有 个项目,第 个项目直接排队要 分钟,使用优速通需要排队 分钟。你有 张优速通票,也就是意味着你可以选不超过 个项目使用优速通。你一共有 分钟,这里忽略除了排队以外的其他时间。你想知道你最多可以玩多少个不同的项目。
第一行三个正整数 , , 。
接下来 行,每行两个正整数 , 。
一个整数,即最多能玩的项目数量。
对于所有数据
。
对于 的数据: 。
对于 的数据: 。
对于 的数据:无特殊限制。
反悔贪心。
显然,前 个肯定是 能选几个是几个。如果选完后 ,则应增加一些项目,有以下两种可能:
新加一个
新加一个 ,并将一个选过的 换成 。
此时我们可以开三个堆,一个存储未选过的 ,另一个存储未选过的 ,最后一个存储选过的 。记三个堆堆顶分别为 、 、 ,则如果 选择第一种,否则选择第二种,不停循环直到 为止。
#include <bits/stdc++.h>
using namespace std ;
#define int long long
#define PII pair<int,int>
#define mp make_pair
const int N=2e5 +10 ;
namespace IO{
inline int read () {
int x=0 ,f=1 ;char ch=getchar();
while (ch<'0' ||ch>'9' ) f=(ch=='-' ?-1 :f),ch=getchar();
while (ch>='0' &&ch<='9' ) x=(x<<1 )+(x<<3 )+(ch^48 ),ch=getchar();
return x*f;
}
inline void write (int x) {
if (x<0 ) putchar ('-' ),x=-x;
if (x>9 ) write(x/10 );
putchar (x%10 +'0' );
}
}using namespace IO;
namespace code{
int n,k,t,ans;
bool vis[N];
struct node {
int a,b;
}a[N];
priority_queue <PII,vector <PII>,greater<PII> > q1,q2,q3;
bool cmp (node x,node y) {
return x.b<y.b;
}
void solve () {
n=read(),k=read(),t=read();
for (int i=1 ;i<=n;i++) a[i].a=read(),a[i].b=read();
sort(a+1 ,a+n+1 ,cmp);
for (int i=1 ;i<=k&&t>=0 ;i++,ans++) t-=a[i].b,vis[i]=1 ;
if (t<0 ) return write(ans-1 ),void ();
for (int i=1 ;i<=n;i++){
if (!vis[i]) q1.push(mp(a[i].a,i)),q2.push(mp(a[i].b,i));
else q3.push(mp(a[i].a-a[i].b,i));
}
while (t>0 ){
int x=q1.top().second,y=q2.top().second,u,v,w;
while (vis[x]) q1.pop(),x=q1.top().second;
while (vis[y]) q2.pop(),y=q2.top().second;
ans++,u=q1.top().first,v=q2.top().first,w=q3.top().first;
if (u<v+w) q1.pop(),vis[x]=1 ,t-=u;
else q2.pop(),q3.pop(),vis[y]=1 ,t-=v+w,q3.push(mp(a[y].a-a[y].b,y));
}
write(t<0 ?--ans:ans);
}
}
signed main () {
code::solve();
return 0 ;
}
__EOF__
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?