专栏文章
CF183D T-shirt 题解
CF183D题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minhkxzt
- 此快照首次捕获于
- 2025/12/02 02:32 3 个月前
- 此快照最后确认于
- 2025/12/02 02:32 3 个月前
考虑 dp。设 表示,对于第 种衣服,考虑到第 个人,有恰好 个人的尺寸合适的概率。容易得到转移方程:
设 表示选择 件第 种衣服的期望收益,则有:
再设 表示,考虑到第 件衣服,且目前一共选择了 件的期望收益。由于每种衣服之间是独立的,可以得到转移方程为:
总时间复杂度为 ,考虑优化。
注意到:
而 ,所以 的差分数组 是单调不增的,于是可以考虑不断地贪心购买贡献最大的衣服。
具体地,设 表示当前购买的第 种衣服的数量, 表示当前再买一件第 种衣服所能带来的贡献, 等于当前的 , 等于当前的 。由于 ,所以有:
于是,每次选择 最大的 ,并更新所有数组中变化的元素即可。
时间复杂度 。
Cconst int N=3005,M=305;
int n,m,c[M];
double p[N][M],D[M],W[N],V[M][N],S[M],ans;
void solve(){
cin>>n>>m;
for(int i=1,x;i<=n;i++) for(int j=1;j<=m;j++) cin>>x,p[i][j]=x*0.001;
for(int i=1;i<=m;i++){
V[i][0]=1;
for(int j=1;j<=n;j++) V[i][j]=V[i][j-1]*(1-p[j][i]);
S[i]=V[i][n],D[i]=1-S[i];
}
for(int x=1;x<=n;x++){
int u=1;
for(int i=1;i<=m;i++) if(D[i]>D[u]) u=i;
ans+=D[u];
for(int j=0;j<=n;j++) W[j]=V[u][j];
V[u][0]=0;
for(int j=1;j<=n;j++) V[u][j]=W[j-1]*p[j][u]+V[u][j-1]*(1-p[j][u]);
S[u]+=V[u][n],D[u]=1-S[u],c[u]++;
}
printf("%.12lf",ans);
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...