社区讨论
萌新刚学OI一分钟,求助
CF311BCats Transport参与者 12已保存回复 14
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 14 条
- 当前快照
- 1 份
- 快照标识符
- @mi7yg0hk
- 此快照首次捕获于
- 2025/11/21 05:40 4 个月前
- 此快照最后确认于
- 2025/11/21 06:43 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
int N,M,P,D[100005],H[100005],T[100005],f[105][100005],sum[100005];
int que[100005],l,r,ans=INT_MAX;
double calc(int u,int j1,int j2){
return (f[u-1][j1]-f[u-1][j2]+sum[j1]-sum[j2])/(j1-j2);
}
int main(){
freopen("in.txt","r",stdin);
ios::sync_with_stdio(false);
cin>>N>>M>>P;
for(int i=2;i<=N;i++){
cin>>D[i];
D[i]+=D[i-1];
}
for(int i=1;i<=M;i++){
cin>>H[i]>>T[i];
T[i]-=D[H[i]];//转化
}
sort(T+1,T+M+1);
for(int i=1;i<=M;i++){
sum[i]+=sum[i-1]+T[i];
f[1][i]=T[i]*i-sum[i];//第一个人选第i只猫子出发
}
for(int u=2;u<=P;u++){//递推第i个人
l=r=1;que[1]=0;
for(int i=1;i<=M;i++){//抱走第i个猫子
while(l<r&&calc(u,que[l],que[l+1])>=T[i])l++;
int j1=que[l];
f[u][i]=f[u-1][j1]+T[i]*(i-j1)-(sum[i]-sum[j1]);
while(l<r&&calc(u,que[r-1],que[r])>=calc(u,que[r-1],i))r--;
que[++r]=i;
}
ans=min(ans,f[u][M]);
}
cout<<ans;
return 0;
}
//f[u][i]=f[u-1][j1]+T[i]*(i-j1)-(sum[i]-sum[j1])
//f[u][i]=f[u-1][j2]+T[i]*(i-j2)-(sum[i]-sum[j2])
//f[u-1][j1]-T[i]*j1+sum[j1]<f[u-1][j2]-T[i]*j2+sum[j2]
//f[u-1][j1]-f[u-1][j2]+sum[j1]-sum[j2]<T[i]*j1-T[i]*j2
回复
共 14 条回复,欢迎继续交流。
正在加载回复...