分析:题目都很简单,笔试中编程题值得注意的点:
1.类名为public classMain{}
2.因main方法为static的,所以所有的接口函数都要设为static。
3.就是对数据的输入,严格按照题目要求的输入规则来。
本题采用了Scanner进行测试数据的输入,注意Scanner对各种不同类型数据的输入和返回boolean的hasNext(),hasNextInt()方法。
题目一:小易的升级之路
小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 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
import java.util.*;
public class Main{
public static void main(String[] args)
{
Scanner in=new Scanner(System.in);//选择了用Scanner处理输入数据
while(in.hasNextInt())//因测试数据有多组,所以用了while()循环
{
int monstersNum=in.nextInt();
int power=in.nextInt();
int[] b=new int[monstersNum];
for(int i=0;i<monstersNum;i++)
{
b[i]=in.nextInt();
}
power=yiGame(power,monstersNum,b);
System.out.println(""+power);
}
in.close();
}
//打怪例程;
public static int yiGame(int a,int n,int[] b)
{
int c=a;
for(int i=0;i<n;i++)
{
if(b[i] <= c)
{
c+=b[i];
}else
{
c+=gcd(b[i],c);
}
}
return c;
}
//求最大公约数例程gcd辗转取余
public static int gcd(int m,int n)
{
if(m < n)
{
int temp=m;
m=n;
n=m;
}
while(n!=0)
{
int yushu=m%n;
m=n;
n=yushu;
}
return m;
}
}
题目二:炮台的攻击
兰博教训提莫之后,然后和提莫讨论起约德尔人,谈起约德尔人,自然少不了一个人,那 就是黑默丁格------约德尔人历史上最伟大的科学家. 提莫说,黑默丁格最近在思考一个问题:黑默丁格有三个炮台,炮台能攻击到距离它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
import java.util.*;
public class Main{
public static void main(String[] args)
{
Scanner in=new Scanner(System.in);
while(in.hasNextInt())
{
//攻击距离
int r=in.nextInt();
//三个炮台坐标
int[] gun1=new int[2];
int[] gun2=new int[2];
int[] gun3=new int[3];
gun1[0]=in.nextInt();
gun1[1]=in.nextInt();
gun2[0]=in.nextInt();
gun2[1]=in.nextInt();
gun3[0]=in.nextInt();
gun3[1]=in.nextInt();
//enemy坐标
int[] enemy=new int[2];
enemy[0]=in.nextInt();
enemy[1]=in.nextInt();
//计算
int count=0;
if(is_attacked(r,gun1,enemy))
count++;
if(is_attacked(r,gun2,enemy))
count++;
if(is_attacked(r,gun3,enemy))
count++;
System.out.println(count+"x");
}
in.close();
}
public static boolean is_attacked(int r,int[] gun,int[] enemy)
{
double distance=Math.sqrt(Math.pow(gun[0]-enemy[0],2)+Math.pow(gun[1]-enemy[1],2));
return distance <= r?true:false;
}
}
题目三:扫描透镜
在N*M的草地上,提莫种了K个蘑菇,蘑菇爆炸的威力极大,兰博不想贸然去闯,而且蘑菇是隐形的.只 有一种叫做扫描透镜的物品可以扫描出隐形的蘑菇,于是他回了一趟战争学院,买了2个扫描透镜,一个 扫描透镜可以扫描出(3*3)方格中所有的蘑菇,然后兰博就可以清理掉一些隐形的蘑菇. 问:兰博最多可以清理多少个蘑菇?
注意:每个方格被扫描一次只能清除掉一个蘑菇。
注意:每个方格被扫描一次只能清除掉一个蘑菇。
输入描述:
第一行三个整数:N,M,K,(1≤N,M≤20,K≤100),N,M代表了草地的大小; 接下来K行,每行两个整数x,y(1≤x≤N,1≤y≤M).代表(x,y)处提莫种了一个蘑菇. 一个方格可以种无穷个蘑菇.
输出描述:
输出一行,在这一行输出一个整数,代表兰博最多可以清理多少个蘑菇.
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in=new Scanner(System.in);
while(in.hasNextInt())
{
//初始化矩阵和矩阵中的蘑菇
//严格按照题目要求的输入规则赋值
int rows=in.nextInt();
int cols=in.nextInt();
int[][] matrix=new int[rows][cols];
int k=in.nextInt();
for(int i=0;i<k;i++)
{
int x=in.nextInt();
int y=in.nextInt();
matrix[x-1][y-1]++;
}
//扫描蘑菇
int first=doitRanbo(matrix,rows,cols);
int second=doitRanbo(matrix,rows,cols);
int total=first+second;
System.out.println(""+total);
}
in.close();
}
//Ranbo do it!!!
public static int doitRanbo(int[][] matrix,int rows,int cols)
{
int max=0;
int row=0;
int col=0;
for(int i=0;i<=rows-3;i++)
{
for(int j=0;j<=cols-3;j++)
{
int count=countNums(matrix,i,j);
if(count > max)//找到蘑菇最多的3*3的小矩阵
{
max=count;
row=i;
col=j;
}
if(max == 9)
{
decline1(matrix,row,col);
return 9;
}
}
}
decline1(matrix,row,col);
return max;
}
//统计每个小矩形中的蘑菇数量
public static int countNums(int[][] matrix,int row,int col)
{
int count=0;
for(int i=row;i<=row+2;i++)
{
for(int j=col;j<=col+2;j++)
{
if(matrix[i][j] > 0)
count++;
}
}
return count;
}
//摧毁蘑菇!!!
public static void decline1(int[][] matrix,int row,int col)
{
for(int i=row;i<=row+2;i++)
{
for(int j=col;j<=col+2;j++)
{
matrix[i][j]--;
}
}
}
}