社区讨论

萌新刚学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 条回复,欢迎继续交流。

正在加载回复...