Soratosorato

ABC366F Maximum Composition 题解

Sorato·2024-08-12 11:38·25 次阅读

ABC366F Maximum Composition 题解

ABC366F Maximum Composition 题解

题目大意#

给定 N 个一次函数 fi(x)=aix+bi,从中选出 K 个函数 fp1,fp2,,fpK,使得 fp1(fp2(fpK)) 最大,求最大值。

Solve#

考虑这样一种情况:我已经选定 pk+1,pk+1,,pK,现在要去选 pkpk1,那么对于候选的 i,j,怎么选更优?

T=fpk+1(fpk+2(fpK)。那么选 pk=i 更优当且仅当

(1)aj(aiT+bi)+bj>ai(ajT+bj)+bi(2)ajbi+bj>aibj+bi(3)(aj1)bi>(ai1)bj

故我们贪心地按 (aj1)bi>(ai1)bj 的规则将 f 排序,即可确定嵌套的先后顺序,排在前面的嵌套时更靠里。

既然我们已经知道了先后顺序,求最值可以 dp 求解。

gi,j 表示仅从前 j 个函数里选, fpi(fpi+1(fpK)) 的最大值。则有 gi,j=max(gi,j1,ajgi1,j1+bj)

Code#

Copy
#include<bits/stdc++.h> using namespace std; inline int read() { short f=1; int x=0; char c=getchar(); while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();} while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f; } const int N=2e5+10,K=15; int n,m,tot; long long f[K]; struct zzn{int a,b;}a[N]; bool cmpp(zzn x,zzn y){return x.b*(y.a-1)>y.b*(x.a-1);} signed main() { n=read();m=read(); for(int i=1;i<=n;i=-~i) a[i]={read(),read()}; sort(a+1,a+n+1,cmpp); f[0]=1; for(int i=1;i<=n;i=-~i) for(int j=m;j;j--) f[j]=max(f[j],f[j-1]*a[i].a+a[i].b); return printf("%lld",f[m]),0; }
posted @   Sorato  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示
目录