【无标题】

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");
		}
		
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值