赞
踩
还是太菜了,17分钟签完到,就自闭了。

题目描述
你从
(
0
,
0
)
(0,0)
(0,0) 走到
(
n
,
n
)
(n,n)
(n,n),只能
u
p
/
r
i
g
h
t
up/right
up/right ,每次方向转变,最多只能转变
(
n
−
1
)
(n-1)
(n−1)次,所以就有n个
s
e
g
m
e
n
t
segment
segment 。然后还会给你
n
~n^~
n 个cost-
C
i
C_i
Ci 。问你最小花费是多少。
思路
当时比赛的时候就想到是贪心,就是最小的那个走多点,其他的只走1步。但是没想到奇偶分开考虑,然后用个奇偶前缀和,动态维护最小值。神奇呀!!!
代码
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e5+10,mod=1e9+7; ll c[N]; #define PII pair<int,int> #define x first #define y second #define PB push_back void solve() { int n; cin>>n; for(int i=1;i<=n;i++){ cin>>c[i]; } ll mino=c[1],mine=c[2];//奇偶的最小值 ll cnto=1,cnte=1;//这个最小值前面的数量 ll qiano=c[1],qiane=c[2];//奇偶前缀和 ll ans=n*c[1]+n*c[2]; for(int i=3;i<=n;i++){ if(i&1){ mino=min(mino,c[i]); ans=min(ans,qiano+qiane+(n-cnto)*mino+(n-cnte)*mine); cnto++;qiano+=c[i]; } else{ mine=min(mine,c[i]); ans=min(ans,qiano+qiane+(n-cnto)*mino+(n-cnte)*mine); cnte++;qiane+=c[i]; } //cout<<i<<" "<<ans<<endl; } cout<<ans<<endl; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t; cin >> t; while (t--) solve(); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。