题目链接:点击打开链接
题目大意:一个周长为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