zoukankan      html  css  js  c++  java
  • 【策略】UVa 11389

    题意:

    有司机,下午路线,晚上路线各n个。给每个司机恰好分配一个下午路线和晚上路线。给出行驶每条路线的时间,如果司机开车时间超过d,则要付加班费d×r。问如何分配路线才能使加班费最少。

    虽然代码看起来很水。但一直不理解为什么,找到这位大神的解释与大家参考。http://www.cnblogs.com/AOQNRMGYXLMV/p/4122236.html

    不妨假设:A1≥A2,B1≤B2,水平线代表d

    情况一:

    如图,司机一要付加班费,司机二不用,如果我们将B1、B2交换:

    因为B1≤B2,所以付给司机一的加班费不会更少,而司机二的开车时间不会增加,所以也不用付加班费。

    因此,交换以后总加班费不会减少。

    情况二:

    两位司机都要付加班费,则超出时间为(A1 + B1 - d) + (A2 + B2 - d)

    如果交换B1、B2:

    • 如果两位司机还是超出正常工作时间,那么总的加班费用不变
    • 如果交换后司机一加班,司机二不加班,则超出时间为(A1 + B2 - d)。用这个减去原来的时间:(A1 + B2 - d) - (A1 + B1 - d) - (A2 + B2 - d) = d - (B1 + A2),因为此时司机二不加班,所以原式≥0,所以总超出时间不会减少

    情况三:

    司机一不付加班费,司机二要付。此时加班时长为(A2 + B2 - d)

    如果交换B1、B2:

    由B1≤B2,A1≥A2,所以B2加到A1上时,司机一一定会加班,司机二一定不会加班,此时加班时长为(A1 + B2 - d),减去原来的时间为(A1 + B2 - d) - (A2 + B2 - d) = (A1 - A2) ≥ 0

    所以总加班时间不会减少。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<algorithm>
     6 
     7 using namespace std;
     8 const int maxn = 1010;
     9 int mor[maxn], aft[maxn];
    10 int main()
    11 {
    12     int n, d, r;
    13     while(~scanf("%d%d%d", &n, &d, &r))
    14     {
    15         if(!n && !d && !r) break;
    16         int sum = 0;
    17         for(int i = 0; i < n; i++)
    18             scanf("%d", &mor[i]);
    19         for(int i = 0; i < n; i++)
    20             scanf("%d", &aft[i]);
    21         sort(mor, mor+n); sort(aft, aft+n);
    22         int ans = 0;
    23         for(int i = 0; i < n; i++)
    24         {
    25             ans += ((mor[i]+aft[n-i-1]-d)*r) >= 0 ? (mor[i]+aft[n-i-1]-d)*r : 0;
    26         }
    27         printf("%d
    ", ans);
    28     }
    29 }
    View Code
  • 相关阅读:
    dubbo学习小计
    学习java虚拟机
    学习java虚拟机
    学习java虚拟机
    学习java虚拟机
    学习设计模式
    学习设计模式
    学习设计模式
    mybatis从入门到精通(五) sqlSession API的使用
    mybatis从入门到精通(四) 动态SQL
  • 原文地址:https://www.cnblogs.com/LLGemini/p/4306056.html
Copyright © 2011-2022 走看看