java题解(一)
牛牛有 n 个平面向量 (x1,y1) ,牛牛把这几个向量相加并输出这个向量的值。
输入描述:
第一行输入一个正整数 n
后续 n 行每行输入两个正整数分别是 x 和 y。
输出描述:
输出所有的向量相加的结果
示例1输入输出示例仅供调试,后台判题数据一般不包含示例
输入
复制
3
1 2
2 1
3 3
输出
复制
6 6
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
Integer x = 0;
Integer y = 0;
Integer sumX = 0;
Integer sumY = 0;
Integer n = cin.nextInt();
for (int i = 0; i < n; i++) {
x = cin.nextInt();
y = cin.nextInt();
sumX = sumX + x;
sumY = sumY + y;
}
System.out.println(sumX + " " + sumY);
}
}
ruby很喜欢吃薯条。
有一天,她拿出了n根薯条。第i根薯条的长度为ai。
ruby认为,若两根薯条的长度之差在l和r之间,则认为这两根薯条有“最萌身高差”。
用数学语言描述,即若l≤|ai-aj|≤r,则第i根薯条和第j根薯条有“最萌身高差”。
ruby想知道,这n根薯条中,存在多少对薯条有“最萌身高差”?
注:次序不影响统计,即认为(ai,aj)和(aj,ai)为同一对。
输入描述:
第一行三个正整数n,l,r,含义见题目描述。 (1≤n≤200000,1≤l≤r≤1e9)
第二行n个正整数ai,分别代表每根薯条的长度。 (1≤ai≤1e9)
输出描述:
一个正整数,代表,代表“最萌身高差”的薯条对数。
示例1输入输出示例仅供调试,后台判题数据一般不包含示例
输入
复制
5 2 3
3 1 6 2 5
输出
复制
4
说明
(3,1)(3,6)(3,5)(2,5)共4对
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
Integer n = 0;
Integer l = 0;
Integer r = 0;
Integer ct = 0;
ArrayList<Integer> a = new ArrayList<>();
n = cin.nextInt();
l = cin.nextInt();
r = cin.nextInt();
for(int i=0; i<n; i++){
a.add(cin.nextInt());
}
a.sort(Integer::compareTo);
int i = 0;
int j = 1;
for(int k=0;k<n;k++){
while ( i<n && a.get(i) - a.get(k) < l){
i++;
}
while (j<n && a.get(j) - a.get(k) <= r){
j++;
}
ct = ct + (j - i);
}
System.out.println(ct);
}
}
小红正在玩一个游戏。游戏的地图是一个nm的迷宫,迷宫有墙和道路,道路上可能会有一些怪物。
小红初始的血量是 hh ,每当小红经过一个有怪物的道路时,小红就会和怪物战斗,击杀怪物并且消耗自己的血量。小红消耗的血量等同于该怪物的战斗力。请注意,如果小红血量为0则死亡。因此只有当小红当前血量大于怪物的战斗力时才可经过该点。
地图共有以下几种标识:
‘.’ 代表道路,小红可以经过。
'’ 代表墙体,小红不能经过。
‘1’~‘9’ 数字,代表该位置是个道路,且上面有一个战斗力为该数字的怪物。
小红只可以上下左右四个方向移动。
小红想知道,自己从左上角到右下角的最短行走路线的距离是多少?
输入描述:
第一行三个正整数 nn 、mm 和 hh ,用空格隔开。
接下来的 nn 行,每行一个长度为 mm 的字符串,用来表示地图。保证输入是合法的。
数据范围:
2\leq n,m,h \leq 502≤n,m,h≤50,且怪物的数量不超过10个。保证左上角和右下角都是道路且没有怪物。
输出描述:
如果小红无法到达右下角,则输出-1。否则输出一个正整数,代表小红走的路径长度最小值。
示例1输入输出示例仅供调试,后台判题数据一般不包含示例
输入
复制
3 3 3
.11
.*.
22.
输出
复制
4
说明
小红先向右走两步,再向下走两步,可到达右下角。中途击杀两只战斗力为1的怪物,剩余血量为1。若小红先向下走,则无法击杀两只血量为2的怪物,无法到达终点。
import java.util.Arrays;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
public class Main {
//坐标节点 类似于C++ 的 struct
static class node{
int x,y;
public node() {
}
public node(int x,int y) {
this.x = x;
this.y = y;
}
}
static int n;
static int m;
static int h;
final static int maxn = 55;
static int hp[][] = new int[maxn][maxn];
static int dx[] = {1,0,-1,0};
static int dy[] = {0,1,0,-1};
//vis 表示到i j 点的最小步数
static int vis[][] = new int[maxn][maxn];
static char mp[][] = new char[maxn][maxn];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
h = sc.nextInt();
//输入地图
for (int i = 1; i <= n; i++) {
String string = sc.next();//用这个吞回车
//System.out.println(string);
char s[] = string.toCharArray();
//System.out.println(s.length);
for (int j = 1; j <=m; j++) {
mp[i][j] = s[j-1];
vis[i][j] = -1;
hp[i][j] = h;
}
}
bfs();
}
private static void bfs() {
//System.out.println("test");
Queue<node> q = new LinkedList<>();
node st = new node(1,1);//起始坐标
vis[1][1] = 0;
int f = 0;
int k = 0;
q.add(st);
while (!q.isEmpty() && f==0) {
//System.out.println(k);
//k++;
node tmp = q.poll();//获取并且拿出来
//四个方向遍历
for (int i = 0; i < dx.length; i++) {
int xx = tmp.x + dx[i];
int yy = tmp.y + dy[i];
if(xx == n && yy == m)//到终点
{
f = 1;
//由于bfs的特性 第一次遍历到终点的一定是最短的路径!
vis[xx][yy] = vis[tmp.x][tmp.y] + 1;
break;//直接退出方向遍历循环和while循环
}
//不超边界 而且不是墙
if(xx>=1 && xx<=n && yy>=1 && yy<=m && mp[xx][yy] != '*') {
if(mp[xx][yy] == '.') {
if(vis[xx][yy] == -1) {
vis[xx][yy] = vis[tmp.x][tmp.y] + 1;
hp[xx][yy] = hp[tmp.x][tmp.y];
q.add(new node(xx,yy));
}else {
//来过的话
if(hp[xx][yy] < hp[tmp.x][tmp.y] || vis[xx][yy] > vis[tmp.x][tmp.y]+1) {
vis[xx][yy] = vis[tmp.x][tmp.y] + 1;
hp[xx][yy] = hp[tmp.x][tmp.y];
q.add(new node(xx,yy));
}
}
}else {
//这个点是怪 要判断是否打得过
if(vis[xx][yy] == -1) {
if(mp[xx][yy] - '0' < hp[tmp.x][tmp.y]) {
hp[xx][yy] = hp[tmp.x][tmp.y] - mp[xx][yy] + '0';
vis[xx][yy] = vis[tmp.x][tmp.y] + 1;
q.add(new node(xx,yy));
}
}else {
//来过
if(hp[xx][yy] <hp[tmp.x][tmp.y] - mp[xx][yy] + '0'
||
vis[xx][yy] > vis[tmp.x][tmp.y]+1) {
hp[xx][yy] = hp[tmp.x][tmp.y] - mp[xx][yy] + '0';
vis[xx][yy] = vis[tmp.x][tmp.y]+1;
q.add(new node(xx,yy));
}
}
}
}
}
}
if(f==1) {
System.out.println(vis[n][m]);
}else {
System.out.println("-1");
}
}
}