0%

The 2024 Shanghai Collegiate Programming Contest K. 时光

思路讲解

就是注意到那,这个如果确定了要面对什么经历,那么肯定是选择从大到小经历最好,现在的问题就在于怎么样求这个东西,以及怎么拼起来?

那么拼起来我们用的是cal函数,其会调用mp解决拼起来的问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 其实逻辑是先搞后一半,因为公式是sumB1*k2+val2+val1,那么我们要最大化sumB1*k2+val2
// 直接搞最大化比较难,但是k比较小,可以记录不同k下的val,最大化这个val。

// 输入剩余值 和 总经历数 返回最大的sumB1*k2+val2
auto cal=[&](ll rem,ll sumB1)->ll{
ll res=0;
for(int i=1;i<=N;++i){
auto it=lower_bound(mp[i].begin(),mp[i].end(),(array<ll,2>){rem,INF});
if(it==mp[i].begin()){
continue;
}
it=prev(it);
ll val2=(*it)[1];
res=max(sumB1*i+val2,res);
}
return res;
};

AC代码

https://codeforces.com/gym/105229/my#

心路历程(WA,TLE,MLE……)