刷题总结——竞赛得分(ssoj)
题目:
题目描述
ZZH 在经历了无数次学科竞赛的失败以后,得到了一个真理:做一题就要对一题!但是要完全正确地做对一题是要花很多时间(包括调试时间),而竞赛的时间有限。所以开始做题之前最好先认真审题,估计一下每一题如果要完全正确地做出来所需要的时间,然后选择一些有把握的题目先做。 当然,如果做完了预先选择的题目之后还有时间,但是这些时间又不足以完全解决一道题目,应该把其他的题目用贪心之类的算法随便做做,争取“骗”一点分数。根据每一题解题时间的估计值,确定一种做题方案(即哪些题目认真做,哪些题目“骗”分,哪些不做),使能在限定的时间内获得最高的得分。
输入格式
第一行有两个正整数 N 和 T,表示题目的总数以及竞赛的时限(单位秒)。以下的 N 行,每行 4 个正整数 W1i 、T1i 、W2i 、T2i ,分别表示第 i 题:完全正确做出来的得分、完全正确做出来所花费的时间(单位秒)、“骗”来的分数、“骗”分所花费的时间(单位秒)。
其中,3≤N≤30,2≤T≤1080000,1≤W1i ,W2i≤30000; 1≤T1i,T2i≤T。
输出格式
输出所能得到的最高分值。
样例数据 1
样例数据 2
题解:
这里引用ssoi官方题解:
简单动态规划,二维费用背包问题,需要使用滚动数组。
此题几乎是裸的 0/1 背包。而 0/1 背包就是一个很典型的顺序可以交换的例子。当然前提是状态是 f[i][j]代表前 i 道题用 j 的时间得到的最多的分数。这种情况下你把 i 放在外层循环或把 j 放在外层循环都是可以 AC 的。因为状态转移方程是 f[i][j]=max(f[i-1][j-cost1[i]]+score1[i],f[i-1][j-cost2[i]]+score2[i],f[i-1][j])。这样无论循环是哪个在外面,枚举到当前状态时,所需的前驱状态都已经计算出来了。
不过特别的,对于这道题,如果采取这样的状态,空间上有些紧张。所以我们必须把 i 那一维优化掉。注意到i每次是由 i-1 转移过来的,并且前驱状态的 j 一定小于等于当前状态的 j!所以如果不设 i 那一维,把 i 放在外面循环并且 j 循环用 downto 的话,就可以保证每次转移的前驱都是 i-1 的情况。这样时间复杂度不变依然是 O(NT),但空间复杂度降到了 O(T)。这是我们对这道题的特殊之处的特殊优化,也可以说我们是对 0/1 背包的特殊之处的特殊优化。
注意用一位数组优化!注意循环外层先枚举题目,然后注意再开两个dp数组防止枚举到同一道题正解贪心都做的情况!!
连基本的背包dp都做不来了····
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
const int W=;
int w1[N],v1[N],w2[N],v2[N],n,t;
int dp[W],dp1[W],dp2[W];
int main()
{
//freopen("a.in","r",stdin);
scanf("%d%d",&n,&t);
for(int i=;i<=n;i++)
scanf("%d%d%d%d",&v1[i],&w1[i],&v2[i],&w2[i]);
for(int i=;i<=n;i++)
{
for(int j=t;j>=w1[i];j--)
dp1[j]=max(dp1[j],dp[j-w1[i]]+v1[i]);
for(int j=t;j>=w2[i];j--)
dp2[j]=max(dp2[j],dp[j-w2[i]]+v2[i]);
for(int j=;j<=t;j++)
dp[j]=max(dp1[j],dp2[j]);
}
int ans=;
for(int j=;j<=t;j++)
ans=max(ans,dp[j]);
cout<<ans<<endl;
return ;
}
刷题总结——竞赛得分(ssoj)的更多相关文章
- [刷题]算法竞赛入门经典(第2版) 4-6/UVa508 - Morse Mismatches
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 代码:(Accepted,10 ms) //UVa508 - Morse Mismatches #include< ...
- [刷题]算法竞赛入门经典(第2版) 5-15/UVa12333 - Revenge of Fibonacci
题意:在前100000个Fibonacci(以下简称F)数字里,能否在这100000个F里找出以某些数字作为开头的F.要求找出下标最小的.没找到输出-1. 代码:(Accepted,0.250s) / ...
- [刷题]算法竞赛入门经典 3-12/UVa11809
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-4/UVa11809:Floating-Point Numbers 代码: //UVa11 ...
- [刷题]算法竞赛入门经典 3-1/UVa1585 3-2/UVa1586 3-3/UVa1225
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO(我也是在网上找到的pdf,但不记得是从哪里搜刮到的了,就重新上传了一遍) PS:第一次写博客分享我的代码,不知道我对c ...
- [刷题]算法竞赛入门经典(第2版) 6-7/UVa804 - Petri Net Simulation
题意:模拟Petri网的执行.虽然没听说过Petri网,但是题目描述的很清晰. 代码:(Accepted,0.210s) //UVa804 - Petri Net Simulation //Accep ...
- [刷题]算法竞赛入门经典(第2版) 6-6/UVa12166 - Equilibrium Mobile
题意:二叉树代表使得平衡天平,修改最少值使之平衡. 代码:(Accepted,0.030s) //UVa12166 - Equilibrium Mobile //Accepted 0.030s //# ...
- [刷题]算法竞赛入门经典(第2版) 6-1/UVa673 6-2/UVa712 6-3/UVa536
这三题比较简单,只放代码了. 题目:6-1 UVa673 - Parentheses Balance //UVa673 - Parentheses Balance //Accepted 0.000s ...
- [刷题]算法竞赛入门经典(第2版) 5-16/UVa212 - Use of Hospital Facilities
题意:模拟患者做手术. 其条件为:医院有Nop个手术室.准备手术室要Mop分钟,另有Nre个恢复用的床.准备每张床要Mre分钟,早上Ts点整医院开张,从手术室手术完毕转移到回复床要Mtr分钟.现在医院 ...
- [刷题]算法竞赛入门经典(第2版) 5-13/UVa822 - Queue and A
题意:模拟客服MM,一共有N种话题,每个客服MM支持处理其中的i个(i < N),处理的话题还有优先级.为了简化流程方便出题,设每个话题都是每隔m分钟来咨询一次.现知道每个话题前来咨询的时间.间 ...
随机推荐
- copyin函数
详见:http://pic.dhe.ibm.com/infocenter/aix/v6r1/index.jsp?topic=%2Fcom.ibm.aix.kerneltechref%2Fdoc%2Fk ...
- java中的堆与栈
Java 中的堆和栈 Java把内存划分成两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配 . 当在一段代码块定义一个变量时,Java就在栈中 ...
- QT+常用控件_Line Edit
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #incl ...
- Arch Linux 天坑
https://wiki.archlinux.org/index.php/Samba_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) samba gui客户端 smb4 ...
- javase(6)_异常
一.异常的概念 1.java异常是Java提供的用于处理程序中错误的一种机制. 2.所谓错误是程序在运行过程中发生的一些异常事件(如:除0,数组下标越界,文件不存在等). 3.Java程序的执行过程中 ...
- Dev-Cpp 5.11 c++编译器下载
Dev-Cpp 5.11 c++编译器下载地址: 链接: https://pan.baidu.com/s/1jHMAf1k 密码: i6nw
- c++ 计算彩票中奖概率
操作方法: 输入两个数字,第一个数字是备选总数,第二个数字是选择总数,然后返回中将概率. 可以投注多次,结束的时候返回总的中将概率. #include <iostream> using n ...
- HDU - 4811 - Ball (思维)
题意: 给出一定数量的三种颜色的球,计算如何摆放得到值最大(有一定顺序) 有三种摆放方法 1.如果放的是第一个(桌子上原来没有),数值不变 2.如果在末尾追加一个,那么增加前面不同颜色的个数的值 3. ...
- noip_最后一遍_1-数学部分
它就是要来了 noip数论一般会以三种形式呈现 注 码风可能有些毒 (有人说我压行qwq) 大概保持标准三十五行左右 为什么是三十五行呢 因为我喜欢这个数字 我喜欢三十五而已(足球球衣也会用这个号哒) ...
- GIMP模版的制作
GIMP自定模版,方便自己作图 新建模版: 设置开机自动加载模版: