华师ACM新生赛1002

楼天城,中国ACM史上最强选手,也是中国公认的大学生计算机编程第一人,经常以一人单挑一个队,在ACM界无人不晓其大名,人称“楼教主”。

传闻当年楼教主军训的时候,说军训太累了,要去放松一下。然后就跑去机房刷题了(如果这都不算爱)。

现在,为了追赶楼教主的脚步,LPT决定努力刷题。现在LPT面前有n条题目,每条题目有一个难度diff和做完这条题可以获得的初始经验值expLPT的初始等级为1级,初始经验值为0,每获得1000经验值可以升一级。

LPT决定按顺序从前往后做这n道题。

当然,做相对于自己的水平来说太简单的题目是无法得到成长的,所以当LPT的等级比题目难度高5或以上的时候,LPT就会放弃这道题目不做。

但是,对于太难的题目,LPT也做不出来,所以当题目难度比LPT的等级高5或以上的时候,LPT是没有办法解出这道题的。但是LPT当然不会轻言放弃,LPT会把这条题目放到自己的未完成题目列表中,以后再拿出来做。

每当LPT做完一条题目,她就会去看未完成题目的列表中,把太简单的题目舍弃掉(题目难度比LPT等级低5或以上),找出里面她能解决的、最早放入题目列表中的一道题目,然后把它给解决掉(这时也算完成一道题目,当然再会去未完成题目列表重头开始找题)。

除此之外,对于题目iLPT解出这题便可以获得

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;
}

     
     
    
    
   
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值