这是题目
7-16 运行超时
作者 朱允刚
单位 吉林大学
在数据结构上机实验中,当你的程序运行时间过长,超出题目限定的时间,将得到“TimeLimit”错误。对题目设定合理的运行时间限制非常重要。
对于每道题目,都有一个由作者亲自编写的标准程序,称为“主标准程序”此外,还有一些可以通过该题的其他标准程序,称为“标准程序”。
假定一共有n个程序,编号为1至n。其中第1个程序为“主标准程序”,其余程序为“标准程序”。假定第i个程序的运行时间为ai秒。
朱老师准备按如下规则设定每道题目的运行时限x:
- 时限不能过于严格,即x≥3a1;
- “标准程序”必须都能通过,即x≥ai+1,(2≤i≤n);
- x须为满足上述条件的最小偶数。
请编写程序帮助朱老师计算每道题目的运行时间限制x。
输入格式:
本题包含多组测试数据,第一行为一个整数T (1 ≤ T ≤ 10),表示测试数据组数。对于每组测试数据,第一行为一个整数n (2 ≤ n ≤ 10),表示程序数目,第二行为n个整数表示程序的运行时间 a1,a2,...,an(1≤ai≤10)。
输出格式:
对于每组测试数据,输出一个整数x。
输入样例:
2
2
1 3
2
1 4
输出样例:
4
6
我们简单分析一下,这道题的难点在于数据太多,不方便计算。
为了解决这个问题,可以把除过第一行的数(第一行的数表示数据的组数)看成一个矩阵,然后定义一个二维数组。
这个二维数组很特殊,行下标为偶数的那一行只有第一个数字有意义,表示了程序数目,
奇数行则表示程序运行时间a1,a2,......,an
这样,我们就容易建立循环了
#include<stdio.h>
int main()
{
int n,c[20][20];
scanf("%d",&n);
int i=0,g=0,j=0;
for(i=0;i<2*n;i=i+2) /*因为一共有n组数据,每组数据占两行,故循环次数小于2n*/
{
scanf("%d",&c[i][0]);
scanf("%d",&c[i+1][0]);
g=3*c[i+1][0]; /*根据题意该组数据第一个数应乘三*/
for(j=1;j<c[i][0];j++) /*c[i][0]表示该组数据的个数*/
{
scanf("%d",&c[i+1][j]);/*i+1行才是需要计算的数据*/
if(g<c[i+1][j]+1)
{
g=c[i+1][j]+1;
}
}
if(g%2==0) /*这个If语句是为了保证所求值是最小偶数*/
printf("%d\n",g);
else
printf("%d\n",g+1);
}
}
大家要是有什么想法,大胆发言,一起交流进步!