1. 程式人生 > >洛谷 P1561 [USACO12JAN]爬山Mountain Climbing

洛谷 P1561 [USACO12JAN]爬山Mountain Climbing

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=12345677
; 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; }
70騙分

發現正解和上面的結論是差不多的。

a、總上山時間大於總下山時間

這說明牛的總上山時間是恒定的,一定要記錄答案的。

記錄答案的還有最後一頭牛的下山時間,所以最終結果是

總上山時間+牛最快的下山時間

b、總下山時間大於總上山時間

這說明牛的下山時間是恒定的,一定要記錄答案的。

記錄答案的還有一頭牛的上山時間,所以最終的結果

是:總下山時間+最快牛的上山時間

代碼:

技術分享
#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long long
using namespace std;

int n;

LL su,sd,mnu,mnd;

int 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; }
View Code

洛谷 P1561 [USACO12JAN]爬山Mountain Climbing