NC200039. Awww Man
描述
输入描述
第一行输入两个整数n和C,之间使用一个空格符分隔,表示游戏中总共会出现的豆子数,和Pac-man每移动一个单位损失的得分。
第二行输入一个整数,表示玩家操控的Pac-Man的初始位置。
从第三行开始的第i行,输入两个整数和
,两个整数之间使用一个空格符分隔,表示第i颗豆子出现的位置和吃掉后能够获得的得分,这样的输入会有n行。
数据规模:
*.
*.
*.
*.
输出描述
输出游戏结束时玩家能够获得的最大得分。
示例1
输入:
2 1 0 1 1 2 1
输出:
0
示例2
输入:
5 2 0 -1 1 1 2 -1 3 1 4 -1 5
输出:
5
示例3
输入:
5 1 2 -3 2 -1 2 -6 8 0 7 -6 9
输出:
14
示例4
输入:
5 1 2 -2 100 2 100 -2 100 2 100 -2 100
输出:
492
C++14(g++5.4) 解法, 执行用时: 360ms, 内存消耗: 20756K, 提交时间: 2019-12-11 16:21:12
#include <iostream> #include<map> #include<queue> #include<vector> #include<algorithm> #include<string> #include<ctime> #include<set> #include<cstring> using namespace std; typedef long long ll; map<ll, long long>r,a,d; int INF = 0x3f3f3f3f; //ll r[10050], a[10050], d[10050]; int main() { ll n, c, v=0; scanf("%lld%lld%lld", &n, &c,&r[0]); for (int i = 1; i <= n; i++) { scanf("%lld%lld", &r[i], &a[i]); v += a[i]; d[i] += d[i-1]+1ll*abs(r[i] - r[i - 1]) * c; } ll ans = v - d[n]; ll maxn = -INF, minn = INF; for (int i = n; i >= 1; i--) //判断开挂时间 { maxn = max(maxn, r[i]); minn = min(minn, r[i]); ans = max(ans, 1ll*(v - d[i - 1] - (maxn - minn) * 2 * c - min(abs(maxn - r[i - 1]), abs(minn - r[i - 1])) * c)); } printf("%lld", ans); }
C++11(clang++ 3.9) 解法, 执行用时: 54ms, 内存消耗: 1640K, 提交时间: 2020-02-25 13:59:55
#include<bits/stdc++.h> using namespace std; const int maxn=1e5+7; int n,a[maxn],v,mx,mn; long long s[maxn],c,z,r,w; int main() { scanf("%d%lld%d",&n,&c,&a[0]); for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&v),r+=v; mx=mn=a[n]; for(int i=n-1;i>=0;i--) { s[i]=2*c*(mx-mn)+c*min(abs(mx-a[i]),abs(mn-a[i])); mx=max(mx,a[i]),mn=min(mn,a[i]); } z=1e18; for(int i=0;i<=n;i++) z=min(z,w+s[i]),w+=c*abs(a[i]-a[i+1]); printf("%lld",r-z); }