傳送門
文章目錄
題意:
給一個二維平面,起點在(0,0)(0,0)(0,0),終點在(n,n)(n,n)(n,n),每次只能往上和往右走,距離隨意,總步數不超過nnn,每一步有一個代價cic_ici?,定義從(0,0)(0,0)(0,0)到(n,n)(n,n)(n,n)總花費是∑ci?disti\sum c_i*dist_i∑ci??disti?,distidist_idisti?是第iii步走的長度。
思路:
我們假設一共走了kkk步,那么說明我們拐了k?1k-1k?1個彎,設每次走的步為dist1,dist2,dist3,...,distkdist_1,dist_2,dist_3,...,dist_kdist1?,dist2?,dist3?,...,distk?,我們可以發現dist1+dist3+...=ndist_1+dist_3+...=ndist1?+dist3?+...=n,dist2+dist4+...=ndist_2+dist_4+...=ndist2?+dist4?+...=n,所以我們可以奇偶分開做就好啦。
分別統計一下奇數和偶數到當前位的cic_ici?最小值,讓后讓最小值走的步最多,其他的disti=1dist_i=1disti?=1即可。
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std
;
typedef long long LL
;
typedef unsigned long long ULL
;
typedef pair
<int,int> PII
;const int N
=1000010,mod
=1e9+7,INF
=0x3f3f3f3f;
const double eps
=1e-6;int n
;
int c
[N
];int main()
{
int _
; scanf("%d",&_
);while(_
--){scanf("%d",&n
);for(int i
=1;i
<=n
;i
++) scanf("%d",&c
[i
]);LL pre1
,pre2
,ans1
,ans2
;pre1
=pre2
=0;ans1
=ans2
=1e18;LL ans
=1e18;LL mi1
,mi2
; mi1
=mi2
=1e18;for(int i
=1,c1
=0,c2
=0;i
<=n
;i
++){if(i
%2==1){mi1
=min(mi1
,1ll*c
[i
]);c1
++;pre1
+=c
[i
];if(i
>=2) ans
=min(ans
,1ll*(n
-c1
)*mi1
+pre1
+ans2
);ans1
=1ll*(n
-c1
)*mi1
+pre1
;}else{mi2
=min(mi2
,1ll*c
[i
]);c2
++;pre2
+=c
[i
];if(i
>=2) ans
=min(ans
,1ll*(n
-c2
)*mi2
+pre2
+ans1
);ans2
=1ll*(n
-c2
)*mi2
+pre2
;}}printf("%lld\n",ans
);}return 0;
}
總結
以上是生活随笔為你收集整理的Educational Codeforces Round 106 (Rated for Div. 2) C. Minimum Grid Path 奇偶 + 思维的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。