贪心-HDU1789 Doing Homework again(活动安排问题)
目录
- 题目
- 题意
- 分析
- 代码
题目
传送门: HDU-1789
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
题意
给出N个作业的截止日期和未完成的罚分,每天只能完成一个作业,求最小的罚分。
分析
首先把作业按截止日期从小到大排序,如果日期相同按罚分降序,我们希望完成尽可能多的作业。然而仅靠日期排序并不是最优的,当一项作业超过截止日期时,我们不能就简单的加上罚分,我们要把它的罚分和前面完成作业的最小罚分相比(优先队列实现),选择罚分较小的那个。
代码
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int maxn = 1003;
int t, n;
pair<int, int>p[maxn];
bool cmp(pair<int, int>a, pair<int, int>b) {
if (a.first == b.first)
return a.second > b.second;
else return a.first < b.first;
}
struct cmp2 {
bool operator()(pair<int, int>a, pair<int, int>b) {
return a.second > b.second;
}
};
int main() {
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &p[i].first);
for (int i = 0; i < n; i++)
scanf("%d", &p[i].second);
sort(p, p + n, cmp);//按日期升序罚分降序
int ans = 0, day = 1;
priority_queue<pair<int, int>,vector<pair<int, int>>, cmp2>q;
for (int i = 0; i < n; i++)
if (p[i].first < day) {//逾期
if (q.top().second < p[i].second) {//和之前罚分最小的比较
ans += q.top().second;
q.pop();
q.push(p[i]);
}
else ans += p[i].second;
}
else {
q.push(p[i]);//入队
day++;
}
printf("%dn", ans);
}
return 0;
}
原创不易,请勿转载(
本不富裕的访问量雪上加霜) 博主首页:https://blog.csdn.net/qq_45034708
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【tensorflow2.0】AutoGraph和tf.Module
- mybatis之第一个mybatis程序(二)
- mybatis-spring整合的三种(逐渐优化)方案
- 用C++跟你聊聊“命令模式”,跟我聊就够了
- 【tensorflow2.0】数据管道dataset
- 用C++跟你聊聊“桥接模式”
- 用C++跟你聊聊“单例模式”,类的“计划生育”
- django-HttpResponse,render,redirect
- django-ForeignKey,OneToOneField,ManyToManyField
- 用C++跟你聊聊“备忘录模式” ,如果能重来,我要···
- 数据库(一)--通过django创建数据库表并填充数据
- springmvc之异常处理中ExceptionHanderExceptionResolver
- 【tensorflow2.0】损失函数losses
- 如何在python文件中测试sql语句
- 用C++跟你聊聊“适配器模式”