楼天城,中国ACM史上最强选手,也是中国公认的大学生计算机编程第一人,经常以一人单挑一个队,在ACM界无人不晓其大名,人称“楼教主”。
传闻当年楼教主军训的时候,说军训太累了,要去放松一下。然后就跑去机房刷题了(如果这都不算爱)。
现在,为了追赶楼教主的脚步,LPT决定努力刷题。现在LPT面前有n条题目,每条题目有一个难度diff和做完这条题可以获得的初始经验值exp。LPT的初始等级为1级,初始经验值为0,每获得1000经验值可以升一级。
LPT决定按顺序从前往后做这n道题。
当然,做相对于自己的水平来说太简单的题目是无法得到成长的,所以当LPT的等级比题目难度高5或以上的时候,LPT就会放弃这道题目不做。
但是,对于太难的题目,LPT也做不出来,所以当题目难度比LPT的等级高5或以上的时候,LPT是没有办法解出这道题的。但是LPT当然不会轻言放弃,LPT会把这条题目放到自己的未完成题目列表中,以后再拿出来做。
每当LPT做完一条题目,她就会去看未完成题目的列表中,把太简单的题目舍弃掉(题目难度比LPT等级低5或以上),找出里面她能解决的、最早放入题目列表中的一道题目,然后把它给解决掉(这时也算完成一道题目,当然再会去未完成题目列表重头开始找题)。
除此之外,对于题目i,LPT解出这题便可以获得:
floor((diff[i]-level+5)/5*exp[i])的经验值。
现在LPT想知道,过完这n题,她能获得多少经验值,和她会把其中的多少题目解出来,你能帮帮她吗?
解题思路:题目文字虽然多,其实本质上是一个很简单的问题:判断与分支。先将所有的题目按序储存在数组里面,然后初始化等级和经验。从第一个数组元素开始判断,如果能够做完这题,那就获得经验,并且升级。然后将这个数组元素标记,表示已经做过了。然后返回数组最上端,重新往下判断;如果不能够做完这道题,那就跳到下一道题。
代码细节:
1.由于需要使用floor函数,所以要定义math.h函数库。这里就有一个陷阱,公式中的exp[i],在函数库中是有定义的,所以不要用exp命名这个数组。
2.每完成一道题目,经验值就会增加,这时候一定要更新等级,因为等级会影响下一次的经验值的多少。
3.用标记元素将某个题目表示已经完成,这里将数组赋值一个负数就好。
4..经验值与等级的关系:rank=exp_now/1000+1;
5.用一个计时器计算循环量,等效于完成题目的次数。
代码清单:
#include
#include
#define MAX_DIFF 1010
#define MAX_EXP 1010
int diff[MAX_DIFF],aexp[MAX_EXP];
int main()
{
int rank,count,exp_now,pro_num,T;
scanf("%d",&T);
for(int i=0;i
0)
{
exp_now=exp_now+floor((diff[i]-rank+5)*aexp[i]/5);
rank=exp_now/1000+1;
diff[i]=-1;
count++;
i=0;
}
else
i++;
}
printf("%d %d\n",exp_now,count);
}
return 0;
}