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

 

转载于:https://www.cnblogs.com/third2333/p/6980484.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值