网易编程题
1.小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为b1,b2,b3…bn. 如果遇到的怪物防御力bi小于等于小易的当前能力值c,那么他就能轻松打败怪物,并 且使得自己的能力值增加bi;如果bi大于c,那他也能打败怪物,但他的能力值只能增加bi 与c的最大公约数.那么问题来了,在一系列的锻炼后,小易的最终能力值为多少?
输入描述
对于每组数据,第一行是两个整数n(1≤n<100000)表示怪物的数量和a表示小易的初始能力值. 第二行n个整数,b1,b2…bn(1≤bi≤n)表示每个怪物的防御力
输出描述
对于每组数据,输出一行.每行仅包含一个整数,表示小易的最终能力值
输入例子
3 50 50 105 200 5 20 30 20 15 40 100
输出例子
110 205
解题思路:题目基本没什么难度,按照题目意思写程序,主要知道什么是最大公约数(最大公约数:指能够整除这些整数的最大整数)
参考答案:
public class WrittenQuestion3_1 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()){
//怪物数量
int n = scanner.nextInt();
//小易初始能力值
int a= scanner.nextInt();
//bi怪物能力值
int[] b = new int[n];
for(int i = 0;i<n;i++){
b[i] = scanner.nextInt();
}
System.out.println(getResult(n, a, b));
}
}
/**
* 计算结果
* @param n 怪物数量
* @param c 小易当前能力值
* @param b 怪物防御值
* @return
*/
private static int getResult(int n, int c, int[] b){
for(int i =0; i < n; i++){
//当前能力值大于等于怪物防御值
if(c >= b[i]){
c += b[i];
}
else { //当前能力值小于怪物防御值
c += maxCommonDivisor(c, b[i]);
}
}
return c;
}
//最大公约数
public static int maxCommonDivisor(int m, int n) {
if (m < n) {// 保证m>n,若m<n,则进行数据交换
int temp = m;
m = n;
n = temp;
}
while (m % n != 0) {// 在余数不能为0时,进行循环
int temp = m % n;
m = n;
n = temp;
}
return n;// 返回最大公约数
}
}
2.兰博教训提莫之后,然后和提莫讨论起约德尔人,谈起约德尔人,自然少不了一个人,那 就是黑默丁格------约德尔人历史上最伟大的科学家. 提莫说,黑默丁格最近在思考一个问题:黑默丁格有三个炮台,炮台能攻击到距离它R的敌人 (两点之间的距离为两点连续的距离,例如(3,0),(0,4)之间的距离是5),如果一个炮台能攻击 到敌人,那么就会对敌人造成1×的伤害.黑默丁格将三个炮台放在N*M方格中的点上,并且给出敌人 的坐标. 问:那么敌人受到伤害会是多大?
输入描述
第一行9个整数,R,x1,y1,x2,y2,x3,y3,x0,y0.R代表炮台攻击的最大距离,(x1,y1),(x2,y2), (x3,y3)代表三个炮台的坐标.(x0,y0)代表敌人的坐标.
输出描述
输出一行,这一行代表敌人承受的最大伤害,(如果每个炮台都不能攻击到敌人,输出0×)
输入例子
1 1 1 2 2 3 3 1 2
输出例子
2x
解题思路:题目比较长,但也很简单,看懂题目就没问题。题给出了能攻击到的最大距离R,意思就是炮台距离敌人的距离小于等于R就能攻击到,题目中问题转换一下,就是求能攻击到敌人的炮台数量。(输出描述汇中表名,0个炮台攻击到敌人是0x.,以此类推一个是1x,2个是2x......)
参考答案:
public class WrittenQuestion3_2 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
//能攻击到敌人的距离R
int R = scanner.nextInt();
//炮台的位置
Point point1 = new Point(scanner.nextInt(),scanner.nextInt());
Point point2 = new Point(scanner.nextInt(),scanner.nextInt());
Point point3 = new Point(scanner.nextInt(),scanner.nextInt());
//敌人的位置
Point point0 = new Point(scanner.nextInt(),scanner.nextInt());
int count = 0;
count += isAttack(R,getDistance(point1,point0)) ? 1 : 0;
count += isAttack(R,getDistance(point2,point0)) ? 1 : 0;
count += isAttack(R,getDistance(point3,point0)) ? 1 : 0;
System.out.print(count+"x");
}
//计算两点间的距离
private static double getDistance(Point point, Point point0){
return Math.sqrt(Math.pow(point.getX()-point0.getX(),2)
+ Math.pow(point.getY()-point0.getY(),2));
}
//判断是否能攻击到敌人
private static boolean isAttack(int R, double getDistance){
if(getDistance <= R){
return true;
}
return false;
}
}