Larkin’s NOI
Larkin’s NOI
Problem Description
Input
下接N行,每行两个正整数,分别代表这道传统试题需要的时间和它的满分输入保证不会有题目的满分为0分,而且不会有题目需要的时间为0。
最后M行,每行两个正整数,分别代表这道提交答案型试题做1分钟可以获得的分数和它的满分。输入保证这M行中第二个数均为第一个数的倍数,而且不会有题目的满分为0分。
N
<= 500,M <= 100000, T <= 10000., (这里绝对不是 T <= 10000, 至少测试数据到了100000)
Output
Sample Input
3 0 100
1 100
100 200
101 10000
Sample Output
200
样例1解释
全部试题都是传统试题,最优策略为做完第二题,然后就没有时间了。获得的分数为200。(no full score?)
样例2输入
3 1 100
1 102
100 200
101 10000
1 99
样例2输出
201
样例2解释
有三道传统试题和一道提交答案型试题。如果仍然做第2道传统试题,那么得分为200。
而如果先做完第1道传统试题,再花费99分钟做提交答案型试题,获得99分,那么总得分为102+99=201分。(no full score again?)
样例3输入
3 1 100
1 102
100 200
101 10000
1 97
样例3输出
200
样例3解释
有三道传统试题和一道提交答案型试题。如果仍先做完第1道传统试题,
再花费97分钟做提交答案型试题(不能像第2个样例一样花费99分钟,因为那道题满分只有97分),获得97分,那么总得分为102+97=199分。
但如果做第二道传统试题,那么获得的分数为200分。(still no full score?)
样例4输入
3 1 10000
1 100
100 200
101 10000
1 100
样例4输出
10400
样例4解释
不解释……(full score… my favorite…)
解释:
这个题目的意思就是说呢,有两种拿分的题目,一种是分数可以一次拿完,但是要花费一定的时间,另一种是做多长时间,拿相应的分,直到这个题的满分,可以一分钟一分钟的拿分。最开始呢,我认为可能是一个贪心的题目,安装题目分数的权值来贪心,然后发现这个权值找不到。有两种题目,不能权值按照同一标准来。然后就越看越像 多重背包,如果不是题目测试数据中的 T 不是题目给定的 T <= 10000. 那么我多重背包还真的可以过,一次出 运行错误,我就很懵,然后在有除法的地方加了判断,还是 运行错误, 于是我又在 下标的地方做了判断,还是 运行错误, 这个时候我就很懵了。之后我们想到,可不可能是 T 的范围不对,毕竟看M的范围都那么大了,T应该要更大才合理。于是 按照 T >= 10000 的思路去写,一开始没想那么多,就直接又变成超时了,就很难受,就开始优化,各种小细节优化,然而并没有用,常数级的优化,终究还是抵不过数量级的优化。然后重新想。
因为第二种地题目是按照一分钟一分钟的来给分的。那么我先做分高的,再做分低的,那就可以了。并且前面 N 不是很大。所以,我就把第一种题目用01背包来做,多余的空间做第二种题,用贪心来填,再找最大的。
#include<bits/stdc++.h> using namespace std;
const int N = +; struct edge {
int v, w, s;
}edges[N]; int ans[N]; int Scan() { //输入外挂
int res = , ch, flag = ;
if ((ch = getchar()) == '-')
flag = ;
else if (ch >= '' && ch <= '')
res = ch - '';
while ((ch = getchar()) >= '' && ch <= '')
res = res * + ch - '';
return flag ? -res : res;
} struct edge temp[N]; bool cmp(edge a, edge b) {
return a.w > b.w;
} int res[N]; int main() {
int n, m, t; while (~scanf("%d %d %d", &n, &m, &t)) {
memset(ans, , sizeof(ans));
int tn = ;
for (int i = ; i <= n; i++) {
edges[tn].v = Scan(); edges[tn].w = Scan(); edges[tn].s = ;
if (edges[tn].v <= t) tn++;
}
ans[] = ;
for (int i = ; i < tn; i++) {
for (int j = t; j >= edges[i].v; j--) {
ans[j] = max (ans[j], ans[j - edges[i].v] + edges[i].w);
}
} for (int i = ; i < m; i++) {
temp[i].w = Scan(); temp[i].s = Scan();
}
sort(temp, temp + m, cmp);
res[] = ;
int tm = ;
for (int i = ; i < m && tm <= t; i++) {
int tx = temp[i].s / temp[i].w;
for (int j = ; j <= tx && tm <= t; j++) {
res[tm] = res[tm - ] + temp[i].w;
tm++;
}
} while(tm <= t) res[tm] = res[tm-], tm++; int max_res = ;
for (int i = ; i <= t; i++) {
int tr = ans[i] + res[t - i];
max_res = max(max_res, tr);
} printf("%d\n", max_res);
}
return ;
}
Larkin’s NOI的更多相关文章
- 从一道NOI练习题说递推和递归
一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可 ...
- NOI 动态规划题集
noi 1996 登山 noi 8780 拦截导弹 noi 4977 怪盗基德的滑翔翼 noi 6045 开餐馆 noi 2718 移动路线 noi 2728 摘花生 noi 2985 数字组合 no ...
- noi 6047 分蛋糕
题目链接:http://noi.openjudge.cn/ch0405/6047/ 和Uva1629很类似,不过,可能用记忆化难写一点,状态初始化懒得搞了.就用循环好了. 状态描叙也可以修改,那个题目 ...
- 洛谷P1371 NOI元丹
P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交 讨论 题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...
- NOI 2015 荷马史诗【BZOJ 4198】k叉Huffman树
抱歉因为NOIP集训,好长时间没再写题解了. NOI 2015也就只有这道题一看就能懂了-- 4198: [Noi2015]荷马史诗 Time Limit: 10 Sec Memory Limit: ...
- noi题库(noi.openjudge.cn) 1.7编程基础之字符串T31——T35
T31 字符串P型编码 描述 给定一个完全由数字字符('0','1','2',-,'9')构成的字符串str,请写出str的p型编码串.例如:字符串122344111可被描述为"1个1.2个 ...
- NOI WC2016滚粗记
Day-4 报到日,今年居然没有发包QAQ,中午到的,志愿者很热情,食堂吃不了(也有可能是吃不惯),空调打不热,有拖线板(好评),有wifi覆盖(虽然听说连上要看脸)(反正我是没连过,用的自己的流量) ...
- NOI题库刷题日志 (贪心篇题解)
这段时间在NOI题库上刷了刷题,来写点心得和题解 一.寻找平面上的极大点 2704:寻找平面上的极大点 总时间限制: 1000ms 内存限制: 65536kB 描述 在一个平面上,如果有两个点( ...
- NOI题库 1768最大子矩阵 题解
NOI题库 1768最大子矩阵 题解 总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大 ...
随机推荐
- 【NOIP2016提高A组五校联考1】挖金矿
题目 分析 我们二分答案 设\(sum_{i,j}\)表示的i列前个数的和, 假设当前出的二分答案为x,第i列挖了\(h_j\)层,则 \[\dfrac{\sum_{i=1}^{n}sum_{i,h_ ...
- Win10看图总有遮挡?如何找回好用的照片查看器
来,大家日常在电脑上查看图片是用什么软件?老牌的ACDSee.XXX看图王.美图看看还是Win系统自带的呢?反正小编在没什么特殊需要的时候,只用系统自带,免除安装.功能够用,想要进行处理也能用Win自 ...
- 计算器work_day05
day_work_05 ------Python是一个优雅的大姐姐 作业计算器 设计思路 按照运算优先级和正则先算括号内的值,提出来判断符号问题,然后依次计算. 分析题目设计了四个函数,分别为a)去括 ...
- 记一次创建svc代理失败
在看尚硅谷的k8s视频中,学到ingress代理的时候,由于之前按照视频安装了V1.15.1,后面环境又出了问题,重新安装了 16.1的,为这次失败埋下了伏笔. 教案中的yaml apiVersion ...
- 一个ros包依赖另一个ros包提供的库
背景: 编写一个点云配准的ros包,记为A,在其中打算使用多种点云配准算法. 同一个ros工作空间下有另一个ros包,记为B,B中提供了几种点云配准算法,并将它们都编译成一个库文件并安装在工作空间中. ...
- mybatis批量插入并返回主键(序列)-oracle
需求:批量插入数据,并返回每条数据的主键(序列),因为这里是采用序列生成唯一的主键的, 其实oracle批量 插入操作有几种,网上百度都是有相关资源的.但是笔者现在的需求是,不仅批量插入数据后,并返回 ...
- 【每日一包0006】dedupe
github地址:https://github.com/ABCDdouyae... dedupe 对数组进行去重,也可以自定义去重(比如要求数组的每一个对象的某个属性不重复) 文档地址:https:/ ...
- 地图服务 纬度、经度对应坐标轴x,y
记下,供自己参考,中国地区的经纬度,经度大,纬度小 如上海经纬度为:(经度, 纬度)(y, x)(lon, lat) 121.48 31.22 纬度---lat----x轴 经度---lon---y轴
- selenium安装环境
selenium自动化环境:selenium+python+chromedriver 驱动/ ie驱动/火狐驱动 1.selenium和python安装 cmd命令里输入:pip install ...
- Mysql锁表问题解决过程
开发中难免会遇到数据库操作锁表问题,这里说下解决过程,算是记录了. show OPEN TABLES where In_use > 0; 查看哪些表被锁了 show processlist 查看 ...