求调代码..CF1625C
  • 板块学术版
  • 楼主sinsop90
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/7/30 19:36
  • 上次更新2023/10/27 17:41:06
查看原帖
求调代码..CF1625C
141599
sinsop90楼主2022/7/30 19:36

谁1700的题会写这么毒瘤啊/kk

#include <bits/stdc++.h>
#define int long long
#define maxn 1005
using namespace std;
int n, m, k, f[maxn][maxn], g[maxn][maxn];//g:last one which is not deleted
struct node {
	int t, w;
}Q[maxn << 1];
signed main() {
	scanf("%lld%lld%lld", &n, &m, &k);
	for(int i = 1;i <= n;i++) scanf("%lld", &Q[i].t);
	for(int i = 1;i <= n;i++) scanf("%lld", &Q[i].w);
	Q[n + 1].t = m, Q[n + 1].w = 0;
	int suf = 0;
	for(int i = 1;i <= n;i++) {
		suf += Q[i].w * (Q[i + 1].t - Q[i].t);
		f[i][0] = suf;
		g[i][0] = i;
		for(int j = 1;j <= min(k, i - 1);j++) {
			int pre = Q[i - 1].w * (Q[i + 1].t - Q[i - 1].t);
			f[i][j] = 1e18;
			for(int l = i - 1;l >= 1;l--) {
				
				if(!f[l][j - (i - l - 1)]) break;
//				if(i == 3 && j == 1) cout << f[l][j - (i - l - 1)] <<endl;
				if(f[l][j - (i - l - 1)] + Q[g[l][j - (i - l - 1)]].w * (Q[i].t - Q[l + 1].t) + Q[i].w * (Q[i + 1].t - Q[i].t) < f[i][j]) {
					f[i][j] = f[l][j - (i - l - 1)] + Q[g[l][j - (i - l - 1)]].w * (Q[i].t - Q[l + 1].t) + Q[i].w * (Q[i + 1].t - Q[i].t);
					g[i][j] = i;
				}
				if(!(j - (i - l - 1))) break;
			} 
			int lt = g[i - 1][j - 1];
			if(f[i - 1][j - 1] + Q[lt].w * (Q[i + 1].t - Q[i].t) == f[i][j]) {
				if(Q[lt].w < Q[g[i][j]].w) g[i][j] = lt;
			}
			if(f[i - 1][j - 1] + Q[lt].w * (Q[i + 1].t - Q[i].t) < f[i][j] || !f[i][j]) {
				f[i][j] = f[i - 1][j - 1] + Q[lt].w * (Q[i + 1].t - Q[i].t);
				g[i][j] = lt;
			}
			for(int l = i - 2;l >= 2;l--) {//force the one which attempt
				if(!f[l][j - 1]) break;
				if(f[l][j - 1] + pre < f[i][j]) {
					f[i][j] = f[l][j - 1] + pre;
					g[i][j] = i - 1;
				}
				else if(f[l][j - 1] + pre == f[i][j]) {
					if(Q[i - 1].w < Q[g[i][j]].w) g[i][j] = i - 1;
				}
				pre += Q[l].w * (Q[l + 1].t - Q[l].t);
			}
		}
	}
//	for(int i = 1;i <= n;i++) {
//		for(int j = 0;j <= i - 1;j++) {
//			cout << f[i][j] << " ";
//		}
//		cout << endl;
//	}
	int ans = 1e18;
	for(int i = 0;i <= k;i++) ans = min(ans, f[n][i]);
	printf("%lld\n", ans);
}

第35个点, 也就是倒数第二个点WA了..

2022/7/30 19:36
加载中...