洛谷 P1561 [USACO12JAN]爬山Mountain Climbing
阿新 • • 發佈:2017-11-06
pen opened target 最終 eee sin main space view
傳送門
題目大意:
n頭牛,上山時間為u(i),下山為d(i).
要求每一時刻最多只有一頭牛上山,一頭牛下山。
問每頭牛都上下山後花費最少時間。
題解:貪心
推了推樣例,發現上山時間一定,那找個下山最快
的當最後一頭山上的牛。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define LL long long #define N 25009 using namespace std; int n; LL ans; int hh=1234567770騙分; struct Cows{ int u,d; }c[N]; bool cmp(Cows a,Cows b){ return a.u<b.u; } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d",&c[i].u,&c[i].d); ans+=c[i].u;hh=min(hh,c[i].d); } cout<<ans+hh; return 0; }
發現正解和上面的結論是差不多的。
a、總上山時間大於總下山時間
這說明牛的總上山時間是恒定的,一定要記錄答案的。
記錄答案的還有最後一頭牛的下山時間,所以最終結果是
總上山時間+牛最快的下山時間
b、總下山時間大於總上山時間
這說明牛的下山時間是恒定的,一定要記錄答案的。
記錄答案的還有一頭牛的上山時間,所以最終的結果
是:總下山時間+最快牛的上山時間
代碼:
#include<iostream> #include<cstdio> #include<cstring> #define LL long long using namespace std; int n; LL su,sd,mnu,mnd;View Codeint main(){ scanf("%d",&n); mnu=mnd=100000000; for(int i=1;i<=n;i++){ int up,down; scanf("%d%d",&up,&down); su+=up;sd+=down; if(up<mnu)mnu=up; if(down<mnd)mnd=down; } if(su>sd)cout<<su+mnd; else cout<<sd+mnu; // cout<<max(su+mnd,sd+mnu); return 0; }
洛谷 P1561 [USACO12JAN]爬山Mountain Climbing