CSU 1640 机智的刷题方式

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

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
#include<map>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn = 100005;
int T, n, m, x[3],tot, c[3];
int f[maxn], u;

int main()
{
	while (cin >> T)
	{
		c[0] = 1;	c[1] = 2;	c[2] = 5;
		while (T--)
		{
			scanf("%d%d%d%d%d", &x[0], &x[1], &x[2], &n, &m);
			memset(f, 0, sizeof(f));
			for (int i = 0; i <= n; i++)
				for (int j = 0; j < 3; j++)
					if (f[i + c[j]]) f[i + c[j]] = min(f[i + c[j]], f[i] + x[j]);
					else f[i + c[j]] = f[i] + x[j];
			u = f[n];
			for (int i = n + 1; i <= n + 5; i++) u = min(u, f[i]);
			printf("%d\n", u);
			memset(f, 0, sizeof(f));
			for (int i = 0; i <= m; i++)
				for (int j = 0; j < 3; j++)
					f[i + x[j]] = max(f[i + x[j]], f[i] + c[j]);
			printf("%d\n", f[m]);
		}
	}
	return 0;
}


你可能感兴趣的:(GSU)