【u202】家庭作业
Time Limit: 1 second
Memory Limit: 128 MB
【问题描述】
老师在开学第一天就把所有作业都布置了,每个作业如果在规定的时间内交上来的话才有学分。每个作业的截止日期和学分可能是不同的
。例如如果一个作业学分为10,要求在6天内交,那么要想拿到这10学分,就必须在第6天结束前交。
每个作业的完成时间都是只有一天。例如,假设有7次作业的学分和完成时间如下:
作业号 1 2 3 4 5 6 7
期限 1 1 3 3 2 2 6
学分 6 7 2 1 4 5 1
最多可以获得15学分,其中一个完成作业的次序为2,6,3,1,7,5,4,注意可能还有其他方法。
你的任务就是找到一个完成作业的顺序获得最大学分。
【输入格式】
第一行一个整数N,表示作业的数量。接下来N行,每行包括两个整数,第一个整数表示作业的完成期限,第二个数表示该作业的学分。
【输出格式】
输出一个整数表示可以获得的最大学分。保证答案不超过longint范围。
【数据规模】
对于所有数据,N<=1000000,作业的完成期限均小于700000。 对于部分数据,N<=1000; 对于部分数据,N<=10000; 对于部分数据,N<=100000; 对于部分数据,作业的完成期限小于100; 对于部分数据,作业的完成期限小于1000;
Sample Input1
7
1 6
1 7
3 2
3 1
2 4
2 5
6 1
Sample Output1
15
#include <cstdio>
#include <algorithm> using namespace std; int n;
struct data
{
int deadline,points;
}; data a[1000009];
int dui[1000009],size = 0,pos,ans = 0; void input_data()
{
scanf("%d",&n);
for (int i = 1;i <= n;i++) //输入n个作业的信息。
scanf("%d%d",&a[i].deadline,&a[i].points);
} int cmp(const data &a,const data &b) //这是sort函数的比较函数 按照最后时限从小到大排序
{ //最后我们会从大到小处理。
if (a.deadline < b.deadline)
return 1;
return 0;
} void up_adjust(int p) //把在p位置上的数试着往上调整
{
int x = dui[p]; //先将其取出来
int i = p,j = p/2;
while (j > 0)
{
if (dui[j] < x) //要调整的时候不改变x直接将a[j]赋值给a[i]。
{
dui[i] = dui[j];
i = j; //然后再往上调整
j = i/2;
}
else //不需要调整了 则结束。
break;
}
dui[i] = x;
pos = i;//可能还要往下调整,所以记录其放在了哪里。
} void down_adjust(int p) //把在堆中p位置上的数字往下调整。
{
int x = dui[p];
int i = p,j = p*2; //获取其儿子节点
while (j <= size)
{
if (j<size && dui[j+1] > dui[j]) //获取它们中的较大值。如果是小根堆则相反。
j++;
if (x < dui[j]) //调整。
{
dui[i] = dui[j];
i = j;
j = i*2;
}
else
break;
}
dui[i] = x; //把x赋值到恰当的位置
} void get_ans()
{
int maxtime = a[n].deadline; //从最大时限开始
int tt = n;
while (tt >= 1 || maxtime > 0) //往前枚举
{
while ( tt > 0 && maxtime == a[tt].deadline) //如果和当前枚举到的时限一样
{
size++; //则把它们加入到堆中
dui[size] = a[tt].points;
up_adjust(size);
down_adjust(pos);
tt--;//同时减少a数组的末指针
}
if (size > 0) //如果堆中还有元素。就把它放在今天完成
{
ans+= dui[1];
dui[1] = dui[size];
size--;
down_adjust(1);
}
maxtime--;
if (maxtime == 0) //如果已经枚举完天数则结束。
break;
}
} void output_ans()
{
printf("%d\n",ans);
} int main()
{
input_data();
sort(a+1,a+1+n,cmp);
get_ans();
output_ans();
return 0;
}
【题解2】
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; int f[700001],n,max_deadline = 0,ans =0 ; //最大期限,用来初始化并查集。
struct zuoye //这个结构体。用来记录每个作业的信息。
{
int deadline,points;
}; zuoye a[1000001]; void input_data()
{
scanf("%d",&n);
for (int i = 1;i <= n;i++) //输入n本作业的信息。
{
scanf("%d%d",&a[i].deadline,&a[i].points);
if (a[i].deadline>max_deadline) //更新最大期限值。
max_deadline = a[i].deadline;
}
} int cmp(const zuoye &a,const zuoye &b) //sort函数的比较函数。
{ //分数从大到小排
if (a.points > b.points)
return 1;
return 0;
} int findfather(int x) //这是并查集的找根节点函数
{
if (f[x] !=x)
f[x] = findfather(f[x]); //路径压缩。
return f[x];
} void get_ans()
{
for (int i = 0;i<= max_deadline;i++) //初始化并查集
f[i] = i;
for (int i = 1;i <= n;i++)
{
int x = findfather(a[i].deadline);//找一下如果最后期限是a[i].deadline。其能够放在哪里
if (x>0) //如果大于0则表示有这样一天,可以用来做这份作业
{
ans+=a[i].points; //直接累加上答案 即可。
f[x] = f[x-1]; //这里不能写成f[a[i].deadline] = f[x-1]。
//因为a[i].deadline 并不是a[i].deadline的根节点。
//不会把其根节点x的所有儿子节点接到f[x-1]上。
}
}
} void output_ans()
{
printf("%d\n",ans);
} int main()
{
input_data();
sort(a+1,a+1+n,cmp); //对a数组进行排序操作。
get_ans();
output_ans();
return 0;
}
【u202】家庭作业的更多相关文章
- 深入理解计算机系统家庭作业汇总 20135301&&20135328
深入理解计算机系统家庭作业 深入理解计算机系统第二章家庭作业 题目2.64 题目要求 判断二进制数偶数位是否有任意一位位为1,有的话返回1,否则返回0 解题过程 int any_even_one(un ...
- CSAPP深入理解计算机系统(第二版)第三章家庭作业答案
<深入理解计算机系统(第二版)>CSAPP 第三章 家庭作业 这一章介绍了AT&T的汇编指令 比较重要 本人完成了<深入理解计算机系统(第二版)>(以下简称CSAPP) ...
- T55359 家庭作业
传送门 思路: 先按学分从大到小排序,根据贪心的思想尽可能地让作业的完成时间延后,这样就能有更多空间给那些限制比较严格的作业 设 f [ i ] 为点 i 向左的最小空闲时间 对于一个限制 t 的作业 ...
- loj10008家庭作业
题目描述 老师在开学第一天就把所有作业都布置了,每个作业如果在规定的时间内交上来的话才有学分.每个作业的截止日期和学分可能是不同的.例如如果一个作业学分为10 ,要求在6 天内交,那么要想拿到这 10 ...
- 51nod 1643 小Q的家庭作业
题意: f(n) = sigma(gcd(i,n)) 1 <= i <= n g(n) = sigma(f(d)) d | n n = x1 * x2 * ... * xm 其中 ...
- thoughtworks家庭作业C++版本
商品类: #ifndef ITEM_H_ #define ITEM_H_ class SalesTax; //This represents the Items which don't have an ...
- 深入理解计算机系统_3e 第二章家庭作业答案
初始完成者:哈尔滨工业大学 李秋豪 许可:除2.55对应代码外(如需使用请联系randy.bryant@cs.cmu.edu),任何人可以自由的使用,修改,分发本文档的代码. 本机环境: (有一些需要 ...
- 深入理解计算机系统_3e 第八章家庭作业 CS:APP3e chapter 8 homework
8.9 关于并行的定义我之前写过一篇文章,参考: 并发与并行的区别 The differences between Concurrency and Parallel +---------------- ...
- 深入理解计算机系统_3e 第七章家庭作业 CS:APP3e chapter 7 homework
7.6 +-----------------------------------------------------------------------+ |Symbol entry? Symbol ...
随机推荐
- ThinkPHP中_after_update、_before_update等的用法
https://blog.csdn.net/aslackers/article/details/50339163 TP系统\Think\Model类里隐藏了几个有用的方法: _before_inser ...
- Spring → 04:Bean(1)
一.Bean概念 Spring Bean是被实例的,组装的及被Spring 容器管理的Java对象. Spring 容器会自动完成@bean对象的实例化. 创建应用对象之间的协作关系的行为称为:装配( ...
- DirectX11 With Windows SDK--11 混合状态
原文:DirectX11 With Windows SDK--11 混合状态 前言 这一章会着重讲述混合状态,在下一章则会讲述深度/模板状态 DirectX11 With Windows SDK完整目 ...
- MUI - 解决弹出输入法时页面高度变小导致底部上浮的问题
解决弹出输入法时页面高度变小导致底部上浮的问题 在有输入框的页面,当输入法弹出的时候,底部元素上浮遮盖了输入框,影响页面美观及功能.查找了一下,页面变窄是不可避免的.即使是设置绝对固定也是不可以的.因 ...
- MySql5.7 配置文件 my.cnf 设置
https://blog.csdn.net/gzt19881123/article/details/52594783 # MySql5.7配置文件my.cnf设置 [client] port = 33 ...
- 51nod 1686 第K大区间【离散化+二分】
题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1686 题意: 定义一个区间的值为其众数出现的次数. 现给出n ...
- qt中窗口绘制——图片的绘制
在qt 中,QPixmap 用于表示一张图片,支持png,jpg格式的加载. QPixmap pm("c:/test.png"); 或者 QPixmap pm; pm.load(& ...
- @atcoder - AGC036E@ ABC String
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个仅由 A, B, C 组成的字符串 S. 求 S 的一个 ...
- huyingsakai的Python学习day1:计算机硬件
1.python是什么?Python是一门编程语言 2.什么是编程语言?(*****)程序员和计算机沟通交流的介质 3.什么是编程?(*****)编程就是程序员想把内心表达的方法用某种计算机语言思维表 ...
- 全站加速(DCDN)- IP应用加速产品解读
5月22日下午15点,阿里云全站加速(DCDN)-IP应用加速如期发布.IP应用加速是阿里云自主研发的一款更高效.更安全.更便捷的动态加速产品,结合阿里云CDN本身的资源优势,利用就近接入.智能路由, ...