一样是70分,没有用前缀和统计功率,新加了t储存时间
查看原帖
一样是70分,没有用前缀和统计功率,新加了t储存时间
75175
huanghaiyang楼主2020/12/27 16:24

直接上代码吧,脑阔痛

#include <bits/stdc++.h>
using namespace std;
const int maxn = 60, m = 0x3f3f3f3f;
int n, c;
int p[maxn], w[maxn];
int d, j;
int f[maxn][maxn][2], t[maxn][maxn][2];
char ch;
int read()
{
	d = 0, ch = getchar();
	while(ch < '0' || ch > '9')
		ch = getchar();
	while(ch >= '0' && ch <= '9')
	{
		d = (d << 1) + (d << 3) + ch - '0';
		ch = getchar();
	}
	return d;
}
int main()
{
	n = read(), c = read();
	for(int i = 1 ; i <= n ; i ++)
	{
		p[i] = read();
		w[i] = read();
	}
	memset(f, 0x3f, sizeof(f));
	f[c][c][0] = f[c][c][1] = 0;
	for(int k = 1 ; k < n ; k ++)
	{
		for(int i = 1 ; i + k <= n ; i ++, j = i + k)
		{
			if(f[i + 1][j][0] < m || f[i + 1][j][1] < m)//是否合法, 防止t无效累加 
			{
				if(f[i + 1][j][0] + (t[i + 1][j][0] + p[i + 1] - p[i]) * w[i] <= f[i + 1][j][1] + (t[i + 1][j][1] + p[j] - p[i]) * w[i])//这里要取等,时间要贪心
				{
					t[i][j][0] = t[i + 1][j][0] + p[i + 1] - p[i];
					f[i][j][0] = f[i + 1][j][0] + t[i][j][0] * w[i];
				}
				else 
				{
					t[i][j][0] = t[i + 1][j][1] + p[j] - p[i];
					f[i][j][0] = f[i + 1][j][1] + t[i][j][0] * w[i];
				}
			}
			if(f[i][j - 1][0] < m || f[i][j - 1][1] < m)
			{
				if(f[i][j - 1][0] + (t[i][j - 1][0] + p[j] - p[i]) * w[j] < f[i][j - 1][1] + (t[i][j - 1][1] + p[j] - p[j - 1]) * w[j])
				{
					t[i][j][1] = t[i][j - 1][0] + p[j] - p[i];
					f[i][j][1] = f[i][j - 1][0] + t[i][j][1] * w[j];
				}
				else 
				{
					t[i][j][1] = t[i][j - 1][1] + p[j] - p[j - 1];
					f[i][j][1] = f[i][j - 1][1] + t[i][j][1] * w[j];
				}
			}
		}
	}
	printf("%d", min(f[1][n][1], f[1][n][0]));
	return 0;
}

会不会是我没有注意后效性?

2020/12/27 16:24
加载中...