import java.util.Scanner;


public class Test25 {
   
    public static void main(String[] args) {
   
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        long[] arrs = new long[n];
        long[] temp = new long[n];
        for (int i = 0; i < n; i++) {
   
            arrs[i] = sc.nextLong();
        }
        for (int i = 1; i <n ; i++) {
   
            temp[i-1] = arrs[i] - arrs[i-1];
            if(temp[i-1] <=0){
   
                System.out.println(-1);
                return;
            }
        }
        long d = helper(temp[0],temp[1]);
        for (int i = 2; i < n-1; i++) {
   
            d = helper(temp[i],d);
        }
        System.out.println(d);
    }
    public static long helper(long num1,long num2){
   
        if(num2 ==0){
   
            return  num1;
        }else {
   
            return helper(num2,num1%num2);
        }
    }
}


输入

3 50

100 50 51

1000 1000 1000

输出

1000

说明

如果先挑战第一只怪物,那么第一只对勇者造成1000点伤害,勇者御力提升1点,接下来挑战第二只,由于防御力已经大于其破防能力勇者不受伤害。接下来挑战第三只,勇者不受伤害,所以总伤害为1000。

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Test26 {
   
    static class Node{
   
        int a;
        int b;
        Node(int a,int b){
   
            this.a = a;
            this.b = b;
        }
        @Override
        public String toString(){
   
            return a+""+b;
        }
    }
    public static void main(String[] args) {
   
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int d = sc.nextInt();
        int[] po = new int[n];
        int[] shang = new int[n];
        for (int i = 0; i < n; i++) {
   
            po[i] = sc.nextInt();
        }
        for (int i = 0; i <n ; i++) {
   
            shang[i] = sc.nextInt();
        }
        Node[] nodes = new Node[po.length];
        for (int i = 0; i < po.length; i++) {
   
            nodes[i] = new Node(po[i],shang[i]);
        }
        Node temp = nodes[0];
        int poivot = d+po.length-1;
        int i = 0, j = po.length-1;
        while(i < j){
   
            while(i < j && nodes[j].a <= poivot) {
   
                --j;
            }
            nodes[i] = nodes[j];
            while(i < j && nodes[i].a > poivot){
   
                ++i;
            }
            nodes[j] = nodes[i];
        }
        nodes[i] = temp;
        int start = nodes.length;
        for(int l = 0; l < nodes.length; ++l) {
   
            if(nodes[l].a <= poivot) {
   
                start = l;
            }
        }
        Arrays.sort(nodes, new Comparator<Node>() {
   
            @Override
            public int compare(Node o1,Node o2){
   
                if(o1.a == o2.a){
   
                    return o1.b - o2.b;
                }
                return o2.a - o1.a;
            }
        });
        int sum = 0;
        for(int l = 0; l < nodes.length; ++l) {
   
            if(nodes[l].a > d+l) {
   
                sum += nodes[l].b;
            }
        }
        System.out.println(sum);
    }
}

题目描述

现在假设一个城市有个人,有一个携带毒的人,在这个城市中一共发生了m起家庭聚会,我们假设这个携带病毒的人参加的家庭聚会中所有人都会被感染,被感染的人还会继续去感染其他,现在想知道,这m场聚会后,这个城市一共有多少人被感染(包括携带病毒的人)人的编号从0开始。

输入描述

对于每一组测试数据,第一行输入3个整数n,m,f,代表这个城市人的个数,发生的家庭聚会个数以及初始携带病毒的人的编号。

接下来输入m行,每一行先输入一个数q,代表这个家庭聚会的人数,接下来后面跟着q个数,代表参加人的编号。

2 <= n <= 10000

1 <= m <= 500

1 ≤q≤50

输入

10 2 0

2 0 3

3 0 1 2

输出

4

思路

把感染的加进队列,然后出队,再把出队的感染者参加的每个聚会的成员入队 ,用 contain判断这个聚会是不是有感染者,直到队空。然后统计所有感染的人 。

import java.util.HashSet;
import java.util.Scanner;

public class Test27 {
   
    public static void main(String[] args) {
   
        Scanner sc = new Scanner(System.in);
        int n,m,f;
        n = sc.nextInt();
        m = sc.nextInt();
        f = sc.nextInt();
        HashSet<Integer> set = new HashSet<>();
        set.add(f);
        for (int i = 0; i < m; i++) {
   
            int q = sc.nextInt();
            int[] part = new int[q];
            boolean flag = false;
            for (int j = 0; j <q ; j++) {
   
                part[j] = sc.nextInt();
                if(set.contains(part[j])){
   
                    flag = true;
                }
                if(flag){
   
                    for (int k = 0; k < q; k++) {
   
                        set.add(part[k]);
                    }
                }
            }

        }
        System.out.println(set.size());
    }
}


优质文章推荐

1.计算机网络----三次握手四次挥手
2.一篇让你彻底了解http请求报文和响应报文的结构
3.梦想成真-----项目自我介绍
4.一篇让你彻底了解HTTP 的前世今生
5.一篇让你彻底搞定HTTP方法与状态码
6.你们要的设计模式来了
7.震惊!来看《这份程序员面试手册》!!!
8.一字一句教你面试“个人简介”
9.接近30场面试分享