您的位置:首页 > 其它

CSU 1640 机智的刷题方式

2016-04-14 16:54 357 查看


1640: 机智的刷题方式

Time Limit: 1 Sec Memory Limit: 128 MB

Submit: 273 Solved: 92

[Submit][Status][Web
Board]


Description

小B想参加中南大学2015年大学生程序设计竞赛暑期集训,相信猛刷自然强的小B表示做题进集训队完全不是事~当然刷题还是有一定技巧的,考虑到每种题的分值不一样,难度不一样,小B要在上面做一些权衡。分数与题目对应关系如下:
入门题1分/题
基础题2分/题
进阶题5分/题
首先,小B希望自己能尽快确保自己入选集训队,已知他做每种题目的时间,还需要H分来达到入队要求,请问他最快能在多长时间内达到要求?
然后,小B想试着挑战一下自己的极限。已知他在接下来的时间里还有X的时间拿来刷题,那么他最多能刷到多少分?


Input

多组数据,第一行有一个整数T,表示有T组数据。(T<=100)
以下每组数据第一行有三个整数A,B,C,表示小B做入门题、基础题和进阶题要花的时间的数量。(1<=A、B、C<=100)
然后第二行是2个整数H,X,分别表示小B还需要的分数和接下来小B拿来刷题的时间。(1<=H、X<=10000)


Output

每组数据输出两行,第一行输出小B刷够H分最少所需时间。第二行输出小B可能刷到的最高分数。


Sample Input

4
1 2 5
3 10
1 2 3
4 10
1 2 4
3 7
2 3 4
3 7


Sample Output

3
10
3
16
3
8
4
7


HINT

完全背包问题
题目里面有一个容易忽视的地方。
因为最后还要求完成H分数所需要的最短时间,那么完成H分数不一定是在X时间内完成的。也有可能在X之后的时间完成。DP数组要开大一些,才能容纳X之后,获得H分数之前的DP状态。

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int MAXN=1000005;
int dp[MAXN];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
int h,x;
scanf("%d%d",&h,&x);
int ans=0;
int score=0;
for(int i=0;i<=x||ans==0;i++)
{
if(i>=a)
dp[i]=max(dp[i],dp[i-a]+1);
if(i>=b)
dp[i]=max(dp[i],dp[i-b]+2);
if(i>=c)
dp[i]=max(dp[i],dp[i-c]+5);
if(dp[i]>=h&&ans==0)
ans=i;
if(i<=x)
score=max(dp[i],score);
}
printf("%d\n%d\n",ans,score);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: