题目大意:
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; }
发现正解和上面的结论是差不多的。
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; }