C. Minimum Grid Path (贪心)

题目

思路:贪心的想如果要使花费尽量小,那就让第一第二小的线段一个向上一个向右尽可能长,只需枚举即可。但是由于有一个每次需要转弯的限制,所以需要分为奇偶,分别记录奇偶前面最小的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;
	}
}

猜你喜欢

转载自blog.csdn.net/asbbv/article/details/114994606