How F
  • 板块灌水区
  • 楼主arrowpoint
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/5 22:08
  • 上次更新2024/10/6 09:03:56
查看原帖
How F
741839
arrowpoint楼主2024/10/5 22:08

我猜了一个结论:每次运输的时间点只可能是 tit_i 或者 ti+xt_i+x,这样只有200的时间点,就直接dp,但是我dp调不出来,有人有什么头猪吗()=

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;

const int N = 1005;
int n,m,a[N];
int f[N][N];
int k,x;
int t[N];
int nt[N],idx;
int pre[N];

signed main(){
	ios::sync_with_stdio(false);
	cin>>n>>k>>x;
	for(int i=1;i<=n;i++){
		cin>>t[i];
		nt[++idx] = t[i],nt[++idx] = t[i]+x;
	}
	sort(nt+1,nt+idx+1);
	for(int i=1;i<=n;i++){
		pre[i] = pre[i-1]+t[i];
	}
	memset(f,0x3f,sizeof f);
	for(int i=0;i<=idx;i++){
		f[0][i] = 0;
	}
	for(int i=1;i<=idx;i++){
		int np;
		if(nt[i]>=t[n]) np = n;
		else np = upper_bound(t+1,t+n+1,nt[i])-t-1;
		int minn = 0x3f3f3f3f;
		for(int j=0;j<=k;j++){
			minn = min(minn,f[i-1][j]);
		}
		f[i][0] = minn;
		for(int j=1;j<=min(np,k);j++){
			int pos = lower_bound(nt+1,nt+idx+1,t[np-j])-nt-1;
			int minn = 0x3f3f3f3f;
			for(int l=0;l<=k;i++){
				minn = min(minn,f[pos][l]);
			}
			f[i][j] = minn + nt[i]*j-pre[np]+pre[np-j];
			cout<<f[i][j]<<endl;
			return 0;
		}
	}
	int u = lower_bound(nt+1,nt+idx+1,t[n])-nt-1;
	int minn = 0x3f3f3f3f;
	for(int i=0;i<=k;i++){
		minn = min(minn,f[u][i]);
	}
	cout<<minn;
	
	return 0;
}
2024/10/5 22:08
加载中...