HDU1789时间贪心

Doing Homework again

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 13883    Accepted Submission(s):
8053

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

想到了是贪心,但一直以为时间可能会给的很大不敢直接按时间一个一个遍历,没想到最后真的这样A的,恶心的题目为啥不说清数据范围!

时间段是不会变化的,所以我们要充分利用好每一个时间段,即在这个时间段里让其获得最大的利益,由于彼此天数之间毫无关系所以可以贪心每一天。

用一个数组记录这一天是否被使用,将结构体排序,排序方式:先按照分数大小排序,如果分数一样,天数大的排在前面;

贪心方法:找出当前某门科目,从这门课的截止日期开始往前推只要遇到没标记的天就占用!

#include<bits/stdc++.h>
using namespace std;
int vis[10005];
struct node
{
int a,b;
}P[1005];
bool cmp(node A,node B)
{
if(A.b==B.b) return A.a>B.a;
else return A.b>B.b;
}
int main()
{
int t,n,m,i,j;
cin>>t;
while(t--){memset(vis,0,sizeof(vis));
cin>>n;int ans=0,sumn=0;
for(i=1;i<=n;++i) cin>>P[i].a;
for(i=1;i<=n;++i) cin>>P[i].b,sumn+=P[i].b;
sort(P+1,P+1+n,cmp);
//for(i=1;i<=n;++i) cout<<P[i].a<<" "<<P[i].b<<endl;
for(i=1;i<=n;++i){
for(j=P[i].a;j>=1;j--){
if(!vis[j]) {vis[j]=1;ans+=P[i].b;break;}
}
}//cout<<ans<<endl;
cout<<sumn-ans<<endl;
}
return 0;
}

时间: 2024-09-28 15:59:57

HDU1789时间贪心的相关文章

HDU1789【贪心】

题目大意:给出n个作业,同时表示有n天.第一行输入表示截止时间(deadline 简称dl)第二行表示如果逾期,要扣除对应的学分. 按分数从大到小排序,如果一样,则dl小的排前面.然后遍历所以科目,如果dl这天没有被占用,则这天完成该作业. #include <iostream> #include <queue> #include <algorithm> #include<cstring> #include<cstdio> using names

Wooden Sticks(hdu1051)

Wooden Sticks Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice _ Description There is a pile of n wooden sticks. The length and weight of each stick are known in advance. The sticks are to be process

UVA4254 Processor

题意:有n个任务,每个任务有三个参数ri,di和wi,表示必须在时刻[ri,di]之内执行,工作量为wi.处理器执行速度可以变化,当执行速度为s时,工作量为wi.处理器的速度可以变化,当执行速度为s时,一个工作量为wi的任务需要执行wi/s个单位时间.任务不一定连续执行,可以分成若干块.求出处理器执行过程中最大速度的最小值. 首先按照左端点排序,然后二分答案,对于每一刻时间贪心地选当前未结束的任务中右端点最小的那个. //Serene #include<algorithm> #include&

【UVA11729】Commando War

给n个人分配任务 分配任务的时间b和执行任务的时间j 每一次只能给一个人分配任务 求最小的时间 贪心求解  将任务 按照执行时间从长到短排序 依次分配任务 并执行 求出时间即所得最短时间 证明自证 #include <cstdio> #include <algorithm> using namespace std; const int maxn = 1010; struct Job{ int b, j; bool operator < (const Job& x) c

Codeforces Round #610 (Div. 2) a/b/c

题目 传送门 A Temporarily unavailable   standard input/output 1 s, 256 MB  给一个线段ab, 问除去 c点圆心半径r覆盖的 线段多长,如果圆在线段外 直接输出 ab 长度就行, 若在线段内 则输出cout << max(b-a-max((min(c+r,b)-max(a,c-r)),0), 0) ,迷糊的话纸上画下大概就能明白.B1 K for the Price of One (Easy Version) , B2 K for

BZOJ_1620_[Usaco2008_Nov]_Time_Management_时间管理_(二分+贪心)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1620 N个工作,每个工作其所需时间,及完成的Deadline,问要完成所有工作,最迟要什么时候开始. 分析 我们可以想到二分开始的时间.对于一个给定的时间,判断是否可以完成. 如何判断呢? 我们假设有\(a,b\)两个任务且\(deadline(a)<deadline(b)\). 如果先完成\(b\),那么要求\(time[b]+time[a]<deadline(a)\). 如果先完成\(

BZOJ 1620 [Usaco2008 Nov]Time Management 时间管理:贪心

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1620 题意: 有n个工作,每一个工作完成需要花费的时间为tim[i],完成这项工作的截止日期为dead[i]. 问你在保证所有工作按时完成的前提下,最晚什么时候开始工作. (每天从时刻0开始算.如果无论如何都完成不了,输出-1) 题解: 贪心. 先将所有工作按dead从大到小排序. 当前开始工作的时间为start(初始为INF). 对于每个工作,start一定要满足两个条件: start

随手练——HDU-2037 时间安排(贪心)

HDU-2037 :http://acm.hdu.edu.cn/showproblem.php?pid=2037 最基础的贪心题目,选取结束时间早的策略. #include <iostream> #include <vector> #include <algorithm> using namespace std; class time { public: int t_s, t_e; time(int s,int e) { t_s = s; t_e = e; } }; i

【算法】贪心算法_节目时间安排问题

问题描述 “今年暑假不学习?” “是吗?那你打算干什么呢?” “看电视剧呀!” “那么多电视剧你看得完吗?” "对哦,那是的好好安排一下节目了." 确实如此,暑假来了,假期档的电视剧也来了,估计很多电视迷会抛开学业,奔向电视. 作为电视迷,一定想看在一天内看尽量多的完整的电视剧.当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大事).流淌的美好时光.长安十二时辰.陈情令,以及王小丫的<开心辞典>等等,假设你已经知道了所有你喜欢看的电视