题解 P1867 【【Mc生存】经验值】

zhouwc

2017-08-30 19:47:00

Solution

#Pascal ###对于这道题目,我最想说的是:请管理员把题目中的初始等级为1改成0(大家可以计算一下样例看看)。 因为我一开始在做这道题的时候就充满疑惑,与样例不匹配。后来才发现了。 好吧,言归正传。对于这一道题目我想出了一种比较简单判断又新奇的方法。 具体算法(在程序中就不一一讲了): 我首先在a数组中存储了达到某一个等级所需要的经验值(这样不用多开循环计算) 为什么算到30级呢?因为2的30次方已经很接近maxlongint了,我相信数据中的经验值应该没这么大 接下便读入一个数,如果生命值大于0,那么就把经验值累加起来。 只要在最后判断一下该经验值在哪一个等级的范围里输出就行了。 对了,记得要考虑等级与经验都为0的情况。于是漂亮的一次过了。 下面附上pascal AC 代码 供同学们参考 ```cpp var n,i,t,y:longint; p:boolean; x,s:real; a:array[1..31]of longint; begin readln(n); s:=10; a[1]:=1; for i:=2 to 30 do a[i]:=a[i-1]*2; for i:=2 to 30 do a[i]:=a[i-1]+a[i]; for i:=1 to n do begin read(x,y); if p=false then begin s:=s-x; if s>10 then s:=10; if s<=0 then p:=true; if p=false then t:=t+y; end; end; for i:=1 to 30 do if (t>=a[i]) and (t<a[i+1]) then begin write(i,' ',t-a[i]); break; end; if t=0 then write(0,' ',0); end. ``` 如有错误,还请指出