ABC 095 D - Static Sushi

题目链接:点击打开链接

题目大意:一个周长为C圆桌上有n个食物,每个食物到原点的路程(顺时针)为xi,其包含的能量为vi,走一个单位路程消耗一个 求能量,求出最多可以获得的能量值(注意,他可以转)。

解题思路:先顺时针跑一遍,记录该点以及该点之前的所有点中能获得的最大能量值,再逆时针同样跑一遍.然后咧开始维护ans,分别求顺时针再转向和逆时针再转向的ans,注意一些细节(比如后面的i为什么从0开始)。

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<map>
#include<set>
#include<vector>
#define FAST ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = (int)1e6 + 5;
const int mod = (int)1e9 + 9;
using namespace std;

ll x[maxn];
int v[maxn];
ll c[maxn], cc[maxn];
ll cmx[maxn], ccmx[maxn];

int main()
{
	//input
	int n; ll C; scanf("%d %lld", &n, &C);
	for(int i = 1; i <= n; i++) scanf("%lld %d", &x[i], &v[i]);
	//solve
	for(int i = 1; i <= n; i++){
		c[i] = c[i-1] + v[i] - (x[i] - x[i-1]);
		cmx[i] = max(cmx[i-1], c[i]);
	}
	x[n+1] = C;
	for(int i = n; i >= 1; i--){
		cc[n-i+1] = cc[n-i] + v[i] - (x[i+1] - x[i]);
		ccmx[n-i+1] = max(ccmx[n-i], cc[n-i+1]); 
	}
	ll ans = 0;
	for(int i = 0; i <= n; i++){
		ans = max(ans, c[i] - x[i] + ccmx[n-i]);
		ans = max(ans, cc[i] - (C - x[n-i+1]) + cmx[n-i]);
	}
	//output
	printf("%lld\n", ans);
	return 0;
}
over

猜你喜欢

转载自blog.csdn.net/swunhj/article/details/80057894