思路:贪心的想如果要使花费尽量小,那就让第一第二小的线段一个向上一个向右尽可能长,只需枚举即可。但是由于有一个每次需要转弯的限制,所以需要分为奇偶,分别记录奇偶前面最小的cost,让奇数的线段向上,偶数的线段向右,先将其余线段长度全部取为1,然后让剩下的长度分别由向上和向右的最小cost线段走完即可,细节见代码。
Code:
#include<iostream>
#include<cmath>
#include<map>
typedef long long ll;
using namespace std;
const int Max = 1e6 + 5;
ll ji[Max], o[Max], sum[Max];
int main()
{
int t;cin >> t;
while (t--)
{
int n;cin >> n;
ll ans = 1e18;
ji[0] = 1e18, o[0] = 1e18;
for (int i = 1;i <= n;i++)
{
ll a;cin >> a;
sum[i] = sum[i - 1] + a;
ji[i] = ji[i - 1], o[i] = o[i - 1];
if (i % 2 == 1)ji[i] = min(a, ji[i - 1]);
else o[i] = min(o[i - 1], a);
}
for (int i = 2;i <= n;i++)
{
ll p;
if (i % 2 == 0)
{
p = sum[i] + ji[i] * (n - i / 2) + o[i] * (n - i / 2);
}
else
{
p = sum[i] + ji[i] * (n - i / 2 - 1) + o[i] * (n - i / 2);
}
ans = min(ans, p);
}
cout << ans << endl;
}
}