P1926 小书童——刷题大军

题目传送门:https://www.luogu.com.cn/problem/P1926

题目背景

数学是火,点亮物理的灯;物理是灯,照亮化学的路;化学是路,通向生物的坑;生物是坑,埋葬学理的人。 文言是火,点亮历史宫灯;历史是灯,照亮社会之路;社会是路,通向哲学大坑;哲学是坑,埋葬文科生。——小A

题目描述

小A“刷题”十分猖狂,明目张胆地“刷题”。他现在在小书童里发现了n样他喜欢的“题目”,每“题”都有他的需要时间,而老师布置了m项作业,每项作业都有它的需要时间及分值,老师规定k分以上算及格。小A只剩r个单位时间,他想在及格的基础上更多地“刷题”。

输入格式

第一行:n m k r。第二行:n个数,代表每“题”他的需要时间。第三行:m个数。表示每项作业它的需要时间。第四行:m个数。代表每项作业它的分值。

输出格式

一个数,代表小A能刷几道题

输入输出样例

输入 #1                                                                             输出 #1

3 4 20 100                                         2
15 20 50
10 15 40 40
5 5 10 15

说明/提示

没有不能及格的情况

对于100%的数据,n≤10,m≤10,k≤50,r≤150

代码如下:(解释全在图里)

#include<iostream>
#include<cstdio>
#include<cmath>
#include<bits/stdc++.h>
using namespace std;
int n,m,k,r;//n,m,k,r分别为题数,作业数,及格分和所剩时间 
int t1[20],t2[20],c[20];//t1为做题需要的时间,t2为做作业需要时间,c为作业分值 
int d[160];//用d[i]时间所能得到的最高分数 
int syt;//剩余可用来做题时间
int zts=0;//刷题数 
int main()
{
	cin>>n>>m>>k>>r;
	for(int i=1;i<=n;i++) cin>>t1[i];//读入每题需要的时间 
	sort(t1+1,t1+n+1);
	for(int i=1;i<=m;i++) cin>>t2[i];//读入做作业需要时间
	for(int i=1;i<=m;i++) cin>>c[i];//读入作业分值
	for(int i=1;i<=m;i++)
	{
		for(int j=r;j>=t2[i];j--)
		{
			d[j]=max(d[j],d[j-t2[i]]+c[i]);//01模板 
		 } 
	} 
	for(int i=1;i<=r;i++)
	{
		if(d[i]>=k)//如果及格了 
		{
			syt=r-i;//已花费做作业的时间不能用来刷题 
			break;//跳出循环 
		}
	}
	for(int i=1;i<=n;i++)//开始刷题
	{
	    if(syt<t1[i]) break;//没时间或者做不了就直接跳出循环
		syt-=t1[i];//减去刷题时间 	 
		zts++;//做题数++
		//把zts++放在后面的原因是不确定syt是否还有时间够刷题 
	} 
	cout<<zts;//输出做题数 
	return 0;
}

  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值