Problem Description
bLue 是一个奇怪的人,具体来说,就是在比赛里不按套路做题。他只会按题目顺序从前向后做题,在解出正在做的题之前不会换题。而且,如果某个题他选择跳过,那么直到比赛结束他也不会再看这道题。
最近,他参加了一场时长 2 小时的比赛,共有 5 题。比赛开始时,bLue 快速地把所有的题都读了一遍,并计算出了他解每一道题需要花费的时间,读题时间忽略不计(厉害了我的 bLue)。
渴望 AK 的 bLue 想知道他要如何安排自己的做题策略,才能使解题数最多。如果有多种方案的解题数相同,则 bLue 会选择总时间最少的方案。
注:总时间为解出每个题时的比赛时间的累加和,如:在 第 10 分钟解出第 1 题,第 30 分钟解出第 2 题,则总时间为 40 分钟。
Input
多组输入,首先输入一个 T (1 <= T <= 100),代表数据组数。
对于每组数据,输入一行,包含 5 个用空格隔开的整数,分别表示 bLue 解出第 1 道题 ~ 第 5 道题需要花费的时间 t (1 <= t <= 120),单位为分钟。
Output
对于每组数据,输出一行,包含 2 个整数,分别表示 bLue 的最大解题数和总时间(若最大解题数相同则取最少时间)。
Example Input
2 10 20 30 40 50 10 60 10 20 30
Example Output
4 200 4 140
Hint
对于第 1 组示例:bLue 可以选择做前 4 题,而第 5 题没有时间做。这样他的解题数最大,共 4 题,解题时间分别为:第 10 分钟、第 30 分钟、第 60 分钟、第 100 分钟。总时间为 10 + 30 + 60 + 100 = 200。
对于第 2 组示例:bLue 可以选择做第 1, 3, 4, 5 题,而跳过第 2 题。这样他的解题数最大,共 4 题,解题时间分别为:第 10 分钟、第 20 分钟、第 40 分钟、第 70 分钟。总时间为 10 + 20 + 40 + 70 = 140。
提示 1 (01:00):为什么不试一下暴力枚举所有可能的解题情况呢?
提示 2 (01:30):不如多套点 for 试一下?最多也就 2^5 嘛~
Author
「SDUT Round #1 - Hello 2017 跨年大作战」bLue
#include<stdio.h>
int main()
{
int a,b,c,d,e,ji;
int g[6],s,t,n;
int sum;
int max,min;
scanf("%d",&t);
while(t--)
{
max=0;
min=666666;
sum=0;
for(int i=0;i<=4;i++)
scanf("%d",&g[i]);
for(a=0;a<=1;a++)
{
for(b=0;b<=1;b++)
{
for(c=0;c<=1;c++)
{
for(d=0;d<=1;d++)
{
for(e=0;e<=1;e++)
{
ji=a+b+c+d+e;
s=sum=0;
if(a) {
s=s+g[0];
sum+=s;
}
if(b) {
s=s+g[1];
sum+=s;
}
if(c) {
s=s+g[2];
sum+=s;
}
if(d) {
s=s+g[3];
sum+=s;
}
if(e) {
s=s+g[4];
sum+=s;
}
if(s>120) continue;
else
{
if(max<ji) {max=ji;min=sum;}
else if(max==ji)
{
if(min>sum) min=sum;
}
}
}
}
}
}
}
printf("%d %d\n",max,min);
}
return 0;
}