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. Jquery实现逐屏加载图片

    引用jquery.scrollLoading.js $(document).ready(function () { //实现图片慢慢浮现出来的效果 $("img").load(fu ...

  2. adb install 安卓apk的包

    ➜  ~ adb install /Users/jkr/Downloads/QYVideoClient-debug.apk /Users/jkr/Downloads/QYVideoClient-deb ...

  3. 51nod 1133 不重叠的线段【贪心/区间覆盖】

    1133 不重叠的线段 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 X轴上有N条线段,每条线段有1个起点S和终点E.最多能够选出多少条互不重叠的 ...

  4. 2017 ACM-ICPC Asia Xi'an Problem A XOR(异或线性基 )

    题目链接  2017西安赛区 Problem A 题意  给定一个数列,和$q$个询问,每个询问中我们可以在区间$[L, R]$中选出一些数. 假设我们选出来的这个数列为$A[i_{1}]$, $A[ ...

  5. POJ 3171 Cleaning Shifts(DP+zkw线段树)

    [题目链接] http://poj.org/problem?id=3171 [题目大意] 给出一些区间和他们的价值,求覆盖一整条线段的最小代价 [题解] 我们发现对区间右端点排序后有dp[r]=min ...

  6. DML数据操纵语言

    --创建表T_HQ_BM2 --create table t_hq_bm2 as select * from t_hq_bm; commit; --添加行内容 --insert into t_hq_b ...

  7. XTU | 物联网概论复习总结

    物联网(IoT) 写在前面 本文严禁转载,只限于学习交流. 这只是笔者在复习所学这门专业课时整理的一些材料,粗制滥造,还望多多包涵. 笔者这里总结复习材料的绝大部分来自叶st老师在最后一节复习课上的提 ...

  8. http网页性能最佳实践

    你愿意为打开一个网页等待多长时间?我一秒也不愿意等.但是事实上大多数网站在响应速度方面都让人失望.现在越来越多的人开始建立自己的网站,博客,你的网页响应速度如何呢?在这篇文章中我们来介绍一下提高网页性 ...

  9. Linux常用网络带宽监控工具(转)

    本文介绍了一些可以用来监控网络使用情况的Linux命令行工具.这些工具可以监控通过网络接口传输的数据,并测量目前哪些数据所传输的速度.入站流量和出站流量分开来显示. 一些命令可以显示单个进程所使用的带 ...

  10. 【微信】微信小程序 微信开发工具 创建js文件报错 pages/module/module.js 出现脚本错误或者未正确调用 Page()

    创建报错pages/module/module.js 出现脚本错误或者未正确调用 Page() 解决方法: 在js文件中添加 Page({ })