# Doing homework again(贪心)
# Doing homework again(贪心)
题目链接:Click here~~
题意:
有 n 门作业,每门作业都有自己的截止期限,当超过截止期限还没有完成作业,就会扣掉相应的分数。问如何才能使扣分最少。
解题思路1:
把 n 门作业按分数从大到小排序,然后每次都把作业安排在离它的截止期限最近的一天(先安排在截止日期当天,如当天已有安排,则往前一天找),并把此天标记为已用,若不能安排,则扣分。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
bool vis[1000];
#define fre freopen("C:\\Users\\Dell\\Desktop\\in.txt", "r", stdin);
struct node{
int dead;
int sub;
bool operator < (const node &a)const{
return a.sub<sub;
}
}stu[1005];
int main(){
//fre;
int t, n, totsub;
cin >> t;
while (t--){
vis[0] = 1;
totsub = 0;
cin >> n;
for (int i = 0; i<n; i++)cin >> stu[i].dead;
for (int i = 0; i<n; i++)cin >> stu[i].sub, totsub += stu[i].sub;
sort(stu, stu + n);
for (int i = 0; i<n; i++){
//int k = 0;
for (int j = stu[i].dead; j >= 1; j--){
if (vis[j] == 0){ vis[j] = 1; totsub -= stu[i].sub; break; }
}
}
cout << totsub << endl;
memset(vis, 0,sizeof(vis) );
}
return 0;
}
解题思路2:
先对日期从小到大排序,如果日期相同,则扣分多的排在前面。如果相同日期内有扣分多的,则就用前面做扣分少的作业的时间来做这门作业;如果没有比他小的,就扣这门作业的分。On,大大优于前面的算法。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<memory.h>
#include<queue>
#include <bits\stdc++.h>
using namespace std;
#define fre freopen("C:\\Users\\Dell\\Desktop\\in.txt", "r", stdin);
priority_queue<int, vector<int>, greater<int> >q; //小的先出队列
struct in
{
int d, s;//deadline,score
}c[1010];
bool cmp(in a, in b){
return a.d<b.d;
}
int main()
{
fre;
int T, n, i, j, t, cnt, ans;
scanf("%d", &T);
while (T--){
cnt = ans = 0;
t = 1;
while (!q.empty()) q.pop();
scanf("%d", &n);
for (i = 1; i <= n; i++) scanf("%d", &c[i].d);
for (i = 1; i <= n; i++) scanf("%d", &c[i].s);
sort(c + 1, c + n + 1, cmp);
for (i = 1; i <= n; i++){
//放入从小到大排序的队列,等之后没时间做分值大的作业时,从队头(分值小的作业)开始放弃分数小的作业
q.push(c[i].s);
//如果截止日期相同,也即某一天有不止一门课要交,则一定要从中选择一门放弃,选代价最小的,但是并未决
//定当天要做哪门
if (c[i].d>=t) t++;
else {
ans += q.top(); q.pop();
}
}
printf("%d\n", ans);
}
return 0;
}
# Doing homework again(贪心)的更多相关文章
- HDU 1789 Doing Homework again(贪心)
Doing Homework again 这只是一道简单的贪心,但想不到的话,真的好难,我就想不到,最后还是看的题解 [题目链接]Doing Homework again [题目类型]贪心 & ...
- hdu--1798--Doing Homework again(贪心)
Doing Homework again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- hdu 1789 Doing HomeWork Again (贪心算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1789 /*Doing Homework again Time Limit: 1000/1000 MS ...
- HDU 1789 - Doing Homework again - [贪心+优先队列]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1789 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...
- HDOJ.1789 Doing Homework again (贪心)
Doing Homework again 点我挑战题目 题意分析 给出n组数据,每组数据中有每份作业的deadline和score,如果不能按期完成,则要扣相应score,求每组数据最少扣除的scor ...
- I - Doing Homework again(贪心)
I - Doing Homework again Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & ...
- HDU_1789_doing homework again_贪心
Doing Homework again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- hdu1789 Doing Homework again(贪心+排序)
Doing Homework again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- HDU-1789 Doing Homework again 贪心问题 有时间限制的最小化惩罚问题
题目链接:https://cn.vjudge.net/problem/HDU-1789 题意 小明有一大堆作业没写,且做一个作业就要花一天时间 给出所有作业的时间限制,和不写作业后要扣的分数 问如何安 ...
- 【HDOJ6343】Graph Theory Homework(贪心)
题意: 给定n个点,每个点有权值a[i],从A走到B的花费是下取整sqrt(a[i]-a[j]),求从1号点走到n号点的最小花费 1<=n,a[i]<=1e5 思路: #include&l ...
随机推荐
- JVM GC之对象生死
1.简述 在Java内存运行时区域的各个部分中,程序计数器.虚拟机栈.本地方法栈3个区域随着线程而生,随着线程而亡.栈中的栈帧随着方法的进入和退出而有条不紊的进行着入栈和出栈操作. 每个栈帧需要分配多 ...
- 重入锁 ReentrantLock (转)(学习记录)
重入锁(ReentrantLock)是一种递归无阻塞的同步机制.以前一直认为它是synchronized的简单替代,而且实现机制也不相差太远.不过最近实践过程中发现它们之间还是有着天壤之别. 以下是官 ...
- 理解JVM
1.JVM运行时数据区 2.方法区 方法区垃圾回收的条件:该类的所有实例(堆内存中)被回收:加载该类字节码的类加载器被回收:所有的类对象(如Student.class)的引用被回收 一般采用可达性分析 ...
- [spring]AOP(切面)编程
AOP 即 Aspect Oriented Program 面向切面编程 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务 ...
- Ceph 分布式存储架构解析与工作原理
目录 文章目录 目录 Ceph 简介 Ceph 的架构:分布式服务进程 Ceph Monitor(MON) Ceph Object Storage Device Daemon(OSD) Ceph Me ...
- 前端之路(二)之JavaScript:菜鸟教程学习:http://www.runoob.com/js/js-intro.html
JavaScript 语句和 JavaScript 变量都对大小写敏感. 键值对通常写法为 name : value (键与值以冒号分割). 键值对在 JavaScript 对象通常称为 对象属性. ...
- Python3命名规范
1.模块 模块尽量使用小写命名,首字母保持小写,尽量不要用下划线(除非多个单词,且数量不多的情况) # 正确的模块名 import decoder import html_parser # 不推荐的模 ...
- linux常用命令(18)find exec
find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了.-exec 参数后面跟的是command命令,它的终止是以 ...
- linux之磁盘管理,网络,计时任务
磁盘管理 查看磁盘空间的占用 df # 磁盘占有率 -h # 以人类易读的方式展示 Linux下磁盘命名格式:/dev/sda 查看目录的占用空间 /dev/sd[a-z]num总大小 linux下磁 ...
- [Python]机器学习:PageRank原理与实现
前言 PageRank是TextRank的前身.顾名思义,TextRank用于文本重要性计算(语句排名)和文本摘要等NLP应用,而Page最初是因搜索引擎需要对网页的重要性计算和排名而诞生.本着追本溯 ...