HDU3661_assignments_活动分配_贪心

/*
*Time: 略
*题目大意:给定n个工作,每个工作有分为a, b两种,有n个工人,每个工人
* 分配一个a, 一个b, 每个工人工作时间限度为t,超过t要另外支付T-t的金额
* 求老板分配的最小额
*解题思路:拿到题目就感觉到用贪心,可以自己无法证明,就久久没有入手。
* 因为是在计算几何专题里面的。
* 目标是要使未能达到t的工人数最少,所以要使每个工人的工作时间尽可能到
* 达t,感觉一边升序排列,一边降序排列即可使结果最优,但还是证明不了。
* 证明贪心的能力有待加强。
*解题感想:水题一道,关键是要看能否看出是水题,最好能证明一下。
*/

View Code
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <functional>
 4 using namespace std;
 5 
 6 const int MAX = 1024;
 7 
 8 void view(int a[], int n)
 9 {
10     for(int i = 0; i < n; i++)
11         cout << a[i] << " ";
12     cout << endl;
13 }
14 
15 int main(void)
16 {
17     int n, t;
18     while(scanf("%d %d", &n, &t) == 2)
19     {
20         int a[MAX], b[MAX];
21         for(int i = 0; i < n; i++)
22             scanf("%d", &a[i]);
23         for(int i = 0; i < n; i++)
24             scanf("%d", &b[i]);
25         sort(a, a + n);
26         sort(b, b + n, greater<int>());
27         //view(a, n);
28         //view(b, n);
29         int sum = 0;
30         for(int i = 0; i < n; i++)
31         {
32             int temp;
33             temp = a[i] + b[i];
34             if(temp > t)
35                 sum += temp - t;
36         }
37         printf("%d\n", sum);
38     }
39     return 0;
40 }
原文地址:https://www.cnblogs.com/cchun/p/2593411.html