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