专栏文章
题解:CF2126D This Is the Last Time
CF2126D题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @miotrx1q
- 此快照首次捕获于
- 2025/12/03 01:01 3 个月前
- 此快照最后确认于
- 2025/12/03 01:01 3 个月前
你有一个初始硬币价值 和 个操作,每个操作形如 。对于每个操作,如果你当前的硬币价值满足 ,则你的硬币价值变成 。你可以按任意次序进行任意次操作,求最终最大的可能的硬币价值。
。
Translated by HPXXZYY.
贪心。
显然, 对于我们是没有用的,因为当 时就算满足条件你也不会进行操作;当 时, 当然也小于 。所以,我们将操作化简为 ,其中 ,当 时,可以将 变成 。
按操作的 从小到大进行排序,如果 ,就贪心的进行操作,最终答案一定最优。
为什么这样贪心是正确的呢?是否有这样的可能,我们需要先进行某次操作 使得 变小,进入另一个操作 的区间,再通过操作 使得 变大?其实是有这样的可能的,但是这道题不会。核心的原因在于 。最开始 不在 的操作区间的原因是 ,即使我们最终通过一系列花里胡哨的操作使得 进入了 的可操作区间 ,,最终变劣了。
CPP
int T,n,k,l[N],r[N],order[N];
bool cmp(int u,int v){
if (l[u]==l[v])
return r[u]>r[v];
return l[u]<l[v];
}
int main(){
T=read();
while (T--){
n=read();k=read();
for(int i=1;i<=n;i++){
l[i]=read();
read();
r[i]=read();
order[i]=i;
}
sort(order+1,order+n+1,cmp);
for(int i=1;i<=n;i++)
if (l[order[i]]<=k&&k<=r[order[i]])
k=r[order[i]];
printf("%d\n",k);
}
return 0;
}
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...