洛谷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 }

 

posted @ 2017-06-11 00:46  third2333  阅读(405)  评论(0编辑  收藏  举报