动规综合练习——应试技巧

应试技巧
Description
  考试就是用分数来评价一个学生的,那么在考试中如何在规定的时间内得到更高的分数就成为关键问题,其实信息学竞赛中又何尝不是如此。

我们知道,平时的在考试中,其中出现的试题一定是我们学过的知识,也就是说,所有的试题只要给足够的时间,那么我们一定能够完全正确的做出来。然而考试不可能没有时间限制,因此我们在开始做题之前最好先认真审题,估计一下每一题如果要完全正确地做出来所需要的时间,然后选择一些有把握的题目先做。 当然,如果做完了预先选择的题目之后还有时间,但是这些时间又不足以完全解决一道题目,应该把其他的简便方法随便做做,争取“骗”一点分数。

现在给出一张试卷上每一题解题时间的估计值,确定一种做题方案(即哪些题目认真做,哪些题目“骗”分,哪些不做),使能在限定的时间内获得最高的得分。
Input
  第1行有两个正整数 N 和 T,表示题目的总数以及竞赛的时限(单位秒);  以下的n行,每行 4 个正整数 W1i 、T1i 、W2i 、T2i ,分别表示第i题:完全正确做出来的得分,完全正确做出来所花费的时间(单位秒),“骗”来的分数,“骗”分所花费的时间(单位秒)。
Output
  只有一行一个整数,表示最高分数。
Sample Input 1
【输入1】
4 10800
18 3600 3 1800
22 4000 12 3000
28 6000 10 3000
32 8000 24 6000

【输入2】
3 7200
50 5400 10 900
50 7200 10 900
50 5400 10 900
Sample Output 1
【输出1】
  50
【输出2】
  70
Hint
  3<=N<=30,2<=T<=1080000,  1 <= W1i、W2i<= 30000,1<=T1i、T2i<=T。

#include<bits/stdc++.h>
using namespace std;
int w1[35],t1[35],w2[35],t2[35];
int f[1080005];  

int main(){
	memset(f,0,sizeof(0));
	int n,t;
	scanf("%d%d",&n,&t);
	for(int i=1;i<=n;i++) scanf("%d%d%d%d",&w1[i],&t1[i],&w2[i],&t2[i]);
	
	for(int i=1;i<=n;i++){
		for(int j=t;j>=min(t2[i],t1[1]);j--){  //类似于01背包
			if(j-t1[i]>=0) f[j]=max(f[j],f[j-t1[i]]+w1[i]);
		    if(j-t2[i]>=0) f[j]=max(f[j],f[j-t2[i]]+w2[i]);     //认真做 与 骗分 的情况
		}
	}
	printf("%d\n",f[t]);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值