题目中因为天数和分数是对应的,所以我们使用一个结构体来存分数和截止如期。

  一开始做这道题的时候,很自然的就想到对天数排序,然后天数一样的分数从大到小排序,最后WA了之后才发现没有做到“舍小取大”的贪心。所以改变一下策略,对分数排序,如果分数一样的话,时间从小到大排序(因为我们的目的就是先做分多的作业,所以分数一样的得放到前几天去做)。

  (具体sort排结构体知识见代码里面,其实也可以写两次for来排序);

  思路:排好序之后,从小到大遍历,每找到一个分数,去寻找对应的天数到第一天中有没有空余的天数(因为要先做分多的),实现寻找空余天数就是从那一天往第一天遍历(((①))),遍历啥子???当然定义一个标记数组来记录你哪一天用来做作业了。如果有空余天就让他在那一天过,如果没有空余天,就是完不成的了,累计加起来,最后输出结果即可。

 1 #include <iostream>
2 #include <algorithm>
3 #include <queue>
4
5 #include <cstdio>
6 #include <cstdlib>
7 #include <cmath>
8 #include <cstring>
9 using namespace std;
10
11 struct ss {
12 int time, p;
13 }t[1010];
14
15 int cmp (const ss a, const ss b) {
16 // if (a.p>b.p) {
17 // return 1;
18 // } else if (a.p==b.p&&a.time<b.time) {
19 // return 1;
20 // } else {
21 // return 0;
22 // }
23
24 // 两种方法都可以
25
26 if (a.p != b.p) {
27 return a.p > b.p;
28 } else {
29 return a.time < b.time;
30 }
31 }
32
33 bool used[1010];
34
35 int main() {
36 int T, num;
37 cin >> T;
38 while (T--) {
39 int res = 0;
40 cin >> num;
41 for (int i = 0; i < num; ++i) {
42 scanf ("%d", &t[i].time);
43 }
44 for (int i = 0; i < num; ++i) {
45 scanf ("%d", &t[i].p);
46 }
47 sort (t, t+num, cmp);
48 memset (used, false, sizeof(used));
49
50 int j;
51 for (int i = 0; i < num; ++i) {
52 for (j = t[i].time; j > 0; --j) {
53 if (!used[j]) {
54 used[j] = true;
55 break;
56 }
57 }
58 if (j == 0) {
59 res += t[i].p;
60 }
61 }
62 cout << res << endl;
63 }
64 return 0;
65 }

思考:①处为什么不可以从第一天遍历?

答:如果从第一天遍历的话,那么很可能把只有一天的交作业时间的科目占用了,后面有空余的天,也是达不到扣最少分的结果的。

HDU - 1789 Doing Homework again(贪心) ~~~学了一波sort对结构体排序的更多相关文章

  1. hdu 1789 Doing HomeWork Again (贪心算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1789 /*Doing Homework again Time Limit: 1000/1000 MS ...

  2. HDU 1789 - Doing Homework again - [贪心+优先队列]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1789 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...

  3. HDU 1789 Doing Homework again(贪心)

    Doing Homework again 这只是一道简单的贪心,但想不到的话,真的好难,我就想不到,最后还是看的题解 [题目链接]Doing Homework again [题目类型]贪心 & ...

  4. HDU 1789 Doing Homework again(贪心)

    在我上一篇说到的,就是这个,贪心的做法,对比一下就能发现,另一个的扣分会累加而且最后一定是把所有的作业都做了,而这个扣分是一次性的,所以应该是舍弃扣分小的,所以结构体排序后,往前选择一个损失最小的方案 ...

  5. HDOJ 1009. Fat Mouse' Trade 贪心 结构体排序

    FatMouse' Trade Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  6. 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(四)

    全系列Index: [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(一) [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(二) [原创]只学到二维数组和结构体,不用链表也能 ...

  7. hdu 1789 Doing Homework again (Greedy)

    Problem - 1789 继续贪心.经典贪心算法,如果数据比较大就要用线段树来维护了. 思路很简单,只要按照代价由大到小排序,然后靠后插入即可.RE了一次,是没想到deadline可以很大.如果d ...

  8. HDOJ 1051. Wooden Sticks 贪心 结构体排序

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  9. Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) C. The Delivery Dilemma (贪心,结构体排序)

    题意:你要买\(n\)份午饭,你可以选择自己去买,或者叫外卖,每份午饭\(i\)自己去买需要消耗时间\(b_i\),叫外卖需要\(a_i\),外卖可以同时送,自己只能买完一份后回家再去买下一份,问最少 ...

随机推荐

  1. java例题_41 利用递归给猴子分桃

    1 /*41 [程序 41 猴子分桃] 2 题目:海滩上有一堆桃子,五只猴子来分.第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把 3 多的一个扔入海中,拿走了一份.第二只猴子把剩下的桃子又平均 ...

  2. HashMap源码个人解读

    HashMap的源码比较复杂,最近也是结合视频以及其余大佬的博客,想着记录一下自己的理解或者当作笔记 JDK1.8后,HashMap底层是数组+链表+红黑树.在这之前都是数组+链表,而改变的原因也就是 ...

  3. C语言const是如何保证变量不被修改的?

    这小段文章要理清楚的是,在C语言中,$const$是如何保证变量不被修改的? 我们可以想到两种方式: 第一种,由编译器来阻止修改$const$变量的语句,让这种程序不能通过编译: 第二种,由操作系统来 ...

  4. 关于一次配合开发工作而产生的服务器内核参数问题(Android 网络问题)

    关于一次配合开发工作而产生的服务器内核参数问题(Android 网络问题) 问题转载(本人与作者遇到了同样的问题) 问题描述 问题描述:在这几年的Android开发中,遇到了一个困扰我好久的问题,有时 ...

  5. ATMS中去pause Activity A.

    上文写完之后,感觉这个部分写的还是不清晰,本文继续补充一下. 首先还是看堆栈. obtain:78, PauseActivityItem (android.app.servertransaction) ...

  6. 201871030117-李亚楠 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    项目 内容 课程班级博客链接 课程班级 这个作业要求链接 作业要求 我的课程学习目标 1.体验软件项目开发中的两个人合作.练习结对编程:2.掌握Github协作开发程序的操作方法:3.熟悉编程语言的综 ...

  7. 解决Spring中使用Example无法查询到Mongodb中的数据问题

    1 问题描述 在Spring Boot中使用Mongodb中的Example查询数据时查询不到,示例代码如下: ExampleMatcher matcher = ExampleMatcher.matc ...

  8. Linux 基础命令 命令进阶

    Linux命令格式:命令 选项 参数 (大部分命令是这个格式) 注意: 1.命令区分大小写 2.短选项可以合并   长选项不能合并 如 : 短选项 -l  -h 可以合并为 -lh 长选项  不能合并 ...

  9. Day17_102_IO_BufferedReader

    BufferedReader 带有缓冲区的字符输入流 * 带有缓冲区的流 - java.io.Reader - java.io.BufferedReader - BufferedReader 字符流 ...

  10. Day10_48_Map集合中的常用方法

    Map集合中的常用方法 * 常用方法 - 注意 Map集合中的key是无序不可重复的set集合,如果添加数据时,key值重复了,后面添加的重复数据也是可以添加成功的,但是会覆盖前面相同的数据. 1. ...