题目要求
分析
先解决2n的数值问题,就打表吧……
写个打表程序,覆盖long的数值范围:
public class Pow {
public static void main(String[] args) {
for (long i = 0; i <= 63; i++) {
System.out.print((long)Math.pow(2, i) + "L,");
}
}
}
之所以写L,是因为普通数值默认int,加L表示是long,好管理……
先看看经验收益有多少。
能收获多少注意生命,生命大于0才有效……
注意一个问题:生命不能大于10,我开始WA了一次就是没注意这个问题,悲催……
算出收益以后就从小到大消耗经验就好了,能到哪步就到哪步,Fine……
AC代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
long[] pow_array = new long[] {1L,2L,4L,8L,16L,32L,64L,128L,256L,512L,1024L,2048L,4096L,8192L,
16384L,32768L,65536L,131072L,262144L,524288L,1048576L,2097152L,4194304L,8388608L,16777216L,
33554432L,67108864L,134217728L,268435456L,536870912L,1073741824L,2147483648L,4294967296L,
8589934592L,17179869184L,34359738368L,68719476736L,137438953472L,274877906944L,549755813888L,
1099511627776L,2199023255552L,4398046511104L,8796093022208L,17592186044416L,35184372088832L,
70368744177664L,140737488355328L,281474976710656L,562949953421312L,1125899906842624L,
2251799813685248L,4503599627370496L,9007199254740992L,18014398509481984L,36028797018963968L,
72057594037927936L,144115188075855872L,288230376151711744L,576460752303423488L,1152921504606846976L,
2305843009213693952L,4611686018427387904L,9223372036854775807L};
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt(), level;
long exp = 0;
double life = 10;
for (int i = 0; i < num; i++) {
life -= scanner.nextDouble();
if (life <= 0) {
break;
} else if (life > 10) {
life = 10;
}
exp += scanner.nextInt();
}
scanner.close();
for (level = 0; level < pow_array.length; level++) {
if (exp < pow_array[level]) {
break;
}
exp -= pow_array[level];
}
System.out.println(level + " " + exp);
}
}