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. redis 的命令总结

    此博客为技术收集和个人的学习积累,如侵犯了您的权益,请联系我,我会及时删除,谢谢 [Redis] redis-cli 命令总结 Redis提供了丰富的命令(command)对数据库和各种数据类型进行操 ...

  2. oracle 的数组(转)

    declare type t_indexby is table of number index by binary_integer; type t_nested is table of number; ...

  3. [9018_1563][bzoj_2144]跳跳棋

    题目描述 Hzwer的跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 某一天,黄金大神和cjy用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.他们 ...

  4. Error C1189: #error: Please use the /MD switch for _AFXDLL builds(转)

    原文转自 https://www.cnblogs.com/zwh0214/p/6048360.html 在VS 2013中编译程序时出现错误: 错误提示1: error C1189: #error : ...

  5. eclipse easy shell plugin

    svn checkout svn://svn.code.sf.net/p/pluginbox/code/trunk pluginbox-code   Eclipse中Easy Shell插件配置Pow ...

  6. Centos 查看进程的几条命令

    1. ps -ef | grep java 表示查看所有进程里 CMD 是 java 的进程信息 2. ps -aux | grep java -aux 显示所有状态 3. kill -9 [PID] ...

  7. WINFORM写入COOKIE

    [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] public static exte ...

  8. 重启服务器“AH00558: apache2: Could not reliably determine the server's fully qualified domain name”问题的解决

    重启服务器时报错: AH00558: apache2: Could not reliably determine the server's fully qualified domain name, u ...

  9. CSS变量使用解析

    很早直接就了解到CSS变量相关的内容,奈何之前使用价值不高(很多主流浏览器不兼容) 最近发现主流浏览器都已经支持了这一变化 这一重要的变化,可能会让你发现,原生CSS从此变的异常强大~,下面看一下如何 ...

  10. (转)MYSQL 的 WITH ROLLUP

    使用 GROUP BY 的 WITH ROLLUP 字句可以检索出更多的分组聚合信息,它不仅仅能像一般的 GROUP BY 语句那样检索出各组的聚合信息,还能检索出本组类的整体聚合信息. 下面我们的例 ...