zoukankan      html  css  js  c++  java
  • 洛谷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
    ",ans) ; 
    39     return 0 ; 
    40 }
  • 相关阅读:
    Python(1)-第一天
    读书笔记-单元测试艺术(三)-使用桩对象解除依赖
    Sql2008调试问题
    读书笔记-单元测试艺术(二)-单元测试框架
    读书笔记-单元测试艺术(一)-单元测试的基本知识
    最长回文子串
    最大连续子序列之和,最大连续子序列乘积
    计数排序与位图排序
    筛选法求素数
    传说中的华为面试题(8分钟写出代码)
  • 原文地址:https://www.cnblogs.com/third2333/p/6980484.html
Copyright © 2011-2022 走看看