hdu 3661

原创 2015年11月17日 19:31:39


Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1769    Accepted Submission(s): 837

Problem Description
In a factory, there are N workers to finish two types of tasks (A and B). Each type has N tasks. Each task of type A needs xi time to finish, and each task of type B needs yj time to finish, now, you, as the boss of the factory, need to make an assignment, which makes sure that every worker could get two tasks, one in type A and one in type B, and, what's more, every worker should have task to work with and every task has to be assigned. However, you need to pay extra money to workers who work over the standard working hours, according to the company's rule. The calculation method is described as follow: if someone’ working hour t is more than the standard working hour T, you should pay t-T to him. As a thrifty boss, you want know the minimum total of overtime pay.

There are multiple test cases, in each test case there are 3 lines. First line there are two positive Integers, N (N<=1000) and T (T<=1000), indicating N workers, N task-A and N task-B, standard working hour T. Each of the next two lines has N positive Integers; the first line indicates the needed time for task A1, A2…An (Ai<=1000), and the second line is for B1, B2…Bn (Bi<=1000).

For each test case output the minimum Overtime wages by an integer in one line.

Sample Input
2 5 4 2 3 5

Sample Output



解法:贪心。将A B排序,A中最大的和B中最小的一组,A中第二大的和B中第二小的一组,以此类推。给出一个简单的证明:若有两组(a0,b0), (a1,b1)满足a0>=a1&&b0>=b1,这两组的得分为max(a0+b0-t,0)+max(a1+b1-t,0) >= max(a0+b1-t,0)+max(a1+b0-t,0)即(a0,b1),(a1,b0)的得分,所以交换b0 b1之后可以使解更优。

#define F first
#define S second
#define PI acos(-1.0)
#define E  exp(1.0)
#define INF 0xFFFFFFF
#define MAX -INF
#define len(a) (__int64)strlen(a)
#define mem0(a) (memset(a,0,sizeof(a)))
#define mem1(a) (memset(a,-1,sizeof(a)))
using namespace std;
__int64 gcd(__int64 a, __int64 b) {
return b ? gcd(b, a % b) : a;
__int64 lcm(__int64 a, __int64 b) {
return a / gcd(a, b) * b;
__int64 max(__int64 a, __int64 b) {
return a > b ? a : b;
__int64 min(__int64 a, __int64 b) {
return a < b ? a : b;
int main() {
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int n, t, sum, a[1010], b[1010];
while (scanf("%d%d", &n, &t) != EOF) {
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
for (int i = 0; i < n; i++) {
scanf("%d", &b[i]);
sort(a, a + n);
sort(b, b + n);
sum = 0;
for (int i = 0; i < n; i++) {
sum += max(0, a[i] + b[n - 1 - i] - t);
printf("%d\n", sum);
return 0;



HDU 3661 Assignments 贪心排序

Assignments Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To...

HDU 4426 (ZOJ 3661) Palindromic Substring 后缀数组二分 + Manacher + Hash

题目大意: 就是现在对于T(T 大致思路: 首先用Manacher算法处理出各个字符为中心的回文半径, 然后由于一个长度为n的字符串中最多只有O(n)个不同的回文串(其实位置不同但序列...

hdu 3661 Assignments【贪心】

Assignments Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To...

POJ 3661-Running(DP)

题目链接:点击打开链接 题意: 在一条直线上运动,每分钟可以运动距离a[i] ,每分钟可以选择运动或者休息,有一个疲劳系数,最初为0,每运动一分钟疲劳系数加1,(不能大于m) 同理,每休息一分钟,疲...

ZOJ 3661 Palindromic Substring(回文树)

ZOJ 3661 Palindromic Substring(回文树)
  • Dacc123
  • Dacc123
  • 2016年05月10日 22:57
  • 481

Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 3661 (ervice.Executor)

前言:当我们在android中的使用JNI下编译的.so库时,很有可能底层编译好的native method出现异常,而且底层并没有对这个异常进行捕捉,这样在我们APK上就是表现为退出程序,查看打印信...

POJ-3661 Running(dp)

Running Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6908   Accept...

poj3661 Running

Description The cows are trying to become better athletes, so Bessie is running on a track for ex...

SDUT 3661 MoutainTop (单调栈) -- 解题报告

题面 MoutainTop Time Limit: 1000MS Memory Limit: 65536KB Problem Description 金石山脉有n个山峰,一字...

poj 3661 Running(dp)

题目链接 Running Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5279  ...
您举报文章:hdu 3661