Doing Homework again

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 6878    Accepted Submission(s): 4096
Problem Description
Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every teacher gives him a deadline of handing in the homework. If Ignatius hands in the homework after the deadline, the teacher will reduce
his score of the final test. And now we assume that doing everyone homework always takes one day. So Ignatius wants you to help him to arrange the order of doing homework to minimize the reduced score.
 
Input
The input contains several test cases. The first line of the input is a single integer T that is the number of test cases. T test cases follow.

Each test case start with a positive integer N(1<=N<=1000) which indicate the number of homework.. Then 2 lines follow. The first line contains N integers that indicate the deadlines of the subjects, and the next line contains N integers that indicate the reduced
scores.
 
Output
For each test case, you should output the smallest total reduced score, one line per test case.
 
Sample Input
3
3
3 3 3
10 5 1
3
1 3 1
6 2 3
7
1 4 6 4 2 4 3
3 2 1 7 6 5 4
 
Sample Output
0
3
5
 
Author
lcy
 
Source
 

题意:有n个任务,每一个任务完毕须要一整天。给出每一个任务完毕的期限和完不成的惩处值。求最小惩处值。

题解:看完这题的第一反应是二分图最优匹配。然后就直接上模板了。结果是超时,后来发现这题能够用贪心,每次选择惩处值最大的任务安排,安排的规则为从该任务的期限后面往前选择一个没有安排任务的天数,将该任务安插在这一天。

贪心:

#include <stdio.h>
#include <string.h>
#include <algorithm> #define maxn 1010 struct Node {
int days, penalty;
} arr[maxn];
bool vis[maxn]; bool cmp(Node a, Node b) {
return a.penalty > b.penalty;
} int main() {
// freopen("stdin.txt", "r", stdin);
int t, n, i, j, sum, sum2;
scanf("%d", &t);
while(t--) {
scanf("%d", &n);
sum = sum2 = 0;
for(i = 0; i < n; ++i)
scanf("%d", &arr[i].days);
for(i = 0; i < n; ++i) {
scanf("%d", &arr[i].penalty);
sum += arr[i].penalty;
}
std::sort(arr, arr + n, cmp);
memset(vis, 0, sizeof(vis));
for(j = 0; j < n; ++j)
for(i = arr[j].days; i; --i)
if(!vis[i]) {
vis[i] = true;
sum2 += arr[j].penalty;
break;
}
printf("%d\n", sum - sum2);
}
return 0;
}

TLE的KM:

#include <stdio.h>
#include <string.h> #define maxn 1010
#define inf 0x3f3f3f3f int G[maxn][maxn];
int Lx[maxn], Ly[maxn];
int match[maxn];
bool visx[maxn], visy[maxn];
int slack[maxn], n, m, sum; bool DFS(int cur) {
int t, y;
visx[cur] = true;
for(y = 1; y <= n; ++y) {
if(visy[y]) continue;
t = Lx[cur] + Ly[y] - G[cur][y];
if(0 == t) {
visy[y] = true;
if(-1 == match[y] || DFS(match[y])) {
match[y] = cur; return true;
}
} else if(slack[y] > t) slack[y] = t;
}
return false;
} int KM() {
int i, j, x, d, ret = 0;
memset(match, -1, sizeof(int) * (n + 1));
memset(Ly, 0, sizeof(int) * (n + 1));
for(i = 1; i <= n; ++i) {
Lx[i] = -inf;
for(j = 1; j <= n; ++j)
if(G[i][j] > Lx[i]) Lx[i] = G[i][j];
}
for(x = 1; x <= n; ++x) {
memset(slack, 0x3f, sizeof(int) * (n + 1));
while(true) {
memset(visx, 0, sizeof(bool) * (n + 1));
memset(visy, 0, sizeof(bool) * (n + 1));
if(DFS(x)) break;
d = inf;
for(i = 1; i <= n; ++i)
if(!visy[i] && d > slack[i])
d = slack[i];
for(i = 1; i <= n; ++i)
if(visx[i]) Lx[i] -= d;
for(i = 1; i <= n; ++i)
if(visy[i]) Ly[i] += d;
else slack[i] -= d;
}
}
for(i = 1; i <= n; ++i)
if(match[i] > -1)
ret += G[match[i]][i];
return ret;
} void getMap() {
int i, w, j;
sum = 0;
scanf("%d", &n);
memset(G, 0, sizeof(G));
for(i = 1; i <= n; ++i)
scanf("%d", &match[i]); // 暂时表示第i个任务能够匹配的天数
for(i = 1; i <= n; ++i) {
scanf("%d", &w);
sum += w;
for(j = 1; j <= match[i]; ++j)
G[i][j] = w;
}
} void solve() {
printf("%d\n", sum - KM());
} int main()
{
// freopen("stdin.txt", "r", stdin);
int t;
scanf("%d", &t);
while(t--) {
getMap();
solve();
}
}



HDU1789 Doing Homework again 【贪心】的更多相关文章

  1. HDU-1789 Doing Homework again 贪心问题 有时间限制的最小化惩罚问题

    题目链接:https://cn.vjudge.net/problem/HDU-1789 题意 小明有一大堆作业没写,且做一个作业就要花一天时间 给出所有作业的时间限制,和不写作业后要扣的分数 问如何安 ...

  2. hdu1789 Doing Homework again(贪心+排序)

    Doing Homework again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  3. hdu1789 Doing Homework again---(经典贪心)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1789 题目大意: 给出N个作业的截至日期,和N个作业不交所扣掉的分数,要求输出扣除分数做少的方案. ...

  4. HDU1789 Doing Homework again 做作业【贪心】

    题目链接:https://vjudge.net/problem/HDU-1789 题目大意: 给出N个作业的截至日期,和N个作业不交所扣掉的分数,要求输出扣除分数做少的方案. 解析: 与上一道销售商品 ...

  5. HDU 1789 Doing Homework again(贪心)

    Doing Homework again 这只是一道简单的贪心,但想不到的话,真的好难,我就想不到,最后还是看的题解 [题目链接]Doing Homework again [题目类型]贪心 & ...

  6. hdu--1798--Doing Homework again(贪心)

    Doing Homework again Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  7. hdu 1789 Doing HomeWork Again (贪心算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1789 /*Doing Homework again Time Limit: 1000/1000 MS ...

  8. HDU 1789 - Doing Homework again - [贪心+优先队列]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1789 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...

  9. HDOJ.1789 Doing Homework again (贪心)

    Doing Homework again 点我挑战题目 题意分析 给出n组数据,每组数据中有每份作业的deadline和score,如果不能按期完成,则要扣相应score,求每组数据最少扣除的scor ...

随机推荐

  1. new Date在ios下的兼容bug

    今天发现在ios下new Date("2019-03-06").getTime()返回NaN 原因是ios下不支持“-”必须用"/" 记录备忘 var d = ...

  2. android与java的关系

    摘自:http://bbs.51cto.com/thread-944897-1.html   相信学习android的人都会想过或者想知道这个问题,那就请你耐心的看完这篇文章吧,你会对android与 ...

  3. python--io

    import io # io模块里面主要使用StringIo和BytesIo # StringIo f = io.StringIO() # 像使用open函数创建文件一样,生成一个句柄 # 可以直接向 ...

  4. 钩子注入呼出与隐藏DLL窗口

    / MFC_DLL.cpp : 定义 DLL 的初始化例程. // #include "stdafx.h" #include "MFC_DLL.h" #incl ...

  5. 【原创】Talend ETL开发——基于joblet的统一的email发送

    更新 2019/1/16:增加了允许5个附件发送.smtp等配置的字段. 一.背景 在ETL数据整合过程中,肯定会涉及到email的通知,比如ETL的执行情况汇报,执行耗时汇报,关键数据更新情况等信息 ...

  6. git提交代码出现错误fatal: Unable to create '项目路径/.git/index.lock': File exists.

    git提交代码出现错误fatal: Unable to create '项目路径/.git/index.lock': File exists. 具体出错代码如下: 具体原因不详,在stackoverf ...

  7. Js 利用正则表达式和replace函数获取string中所有被匹配到的文本

    js的replace函数除了替换文本以外还有获取所有被正则表达式匹配到的文本的功能.这里以一个简单的案例来作为演示. 利用正则查找出所有被两个花括号包裹的字符串: var str = '<div ...

  8. (2)ASP.NET 页面指令

    页面指令 一共有12个指令,这些指令用来控制APS.NET页面的行为. Assembly,Control,Implements,Import,Master,MasterTpye,OutputCache ...

  9. Python之端口扫描器编写

    其实,写个扫描器也挺好玩的,牵涉到了RAW Socket编程,可以尽情地DIY数据包(当然,不符合数据包规则,比如checksum错误就没办法了),收获颇深.其中,我觉得用C语言写更有利于在编写过程中 ...

  10. UTF-8 setup for workspace

    In Eclipse, go to Preferences>General>Workspace and select UTF-8 as the Text File Encoding. Th ...