洛谷P1561 [USACO12JAN]爬山Mountain Climbing 贪心 数学
洛谷P1561 [USACO12JAN]爬山Mountain Climbing
贪心 数学
1、我们可以发现最终的答案 = max( 上山时间总和 + 最快下山时间,下山时间总和 +最快上山时间 )
2、证明 假如上山时间总和 大于下山时间总和
这个时候我们就可以源源不断地上山 ,所谓源源不断地上山,是指这个上了过后马上另一个可以在上山,
换句话说,可能两头牛会在同一时刻等在山顶上,然后这样的话,牛的上山时间就是固定的,下山时间当然是
取最小的一个下山时间了
3、假如下山时间总和小于上山时间,这时候的处理稍微麻烦了一点,因为这时候你要保证能够源源不断地下山,
就不能像上山一样任意一个都能上山了,对于这种情况 要上山时间小于 下山时间的牛优先上 然后再上上山时间
大于下山时间的牛,这样能够保证下山的牛源源不断,因为上山时间总和小于下山时间总和
然后这种方法就是 下山时间总和 + 最快的上山时间 (指的是第一个人)
1 #include <cstdio> 2 #include <cmath> 3 #include <cstdlib> 4 #include <cstring> 5 #include <string> 6 #include <algorithm> 7 #include <iomanip> 8 #include <iostream> 9 using namespace std ; 10 11 struct node{ 12 int u,d ; 13 }; 14 node mi ; 15 int n,sum1,sum2,x,y,ans ; 16 17 inline int read() 18 { 19 char ch = getchar() ; 20 int x = 0 ,f = 1 ; 21 while(ch<'0'||ch>'9') { if(ch=='-') f = -1 ; ch = getchar() ; } 22 while(ch>='0'&&ch<='9') { x = x*10+ch-48 ; ch = getchar() ; } 23 return x*f ; 24 } 25 26 int main() 27 { 28 n = read() ; 29 mi.u = 1e9 ; 30 mi.d = 1e9 ; 31 for(int i=1;i<=n;i++) 32 { 33 x = read(),y = read(),sum1+=x,sum2+=y ; 34 if( mi.u > x ) mi.u = x ; 35 if( mi.d > y ) mi.d = y ; 36 } 37 ans = max(mi.u+sum2,mi.d+sum1) ; 38 printf("%d\n",ans) ; 39 return 0 ; 40 }