传染病统计
题目描述
阿强来到大街上,街上有 N 个人,编号为 1 ∼N 。简单起见,我们把每个人都看成一条线上的一个点。对每个合法的 i,第 i 个人的位置是 x_ixi。
这些人当中恰好有一个感染了 COVID-19,但我们不知道是哪一个。当一个被感染的人和一个未被感染的人之间的距离不超过 2 时,病毒会从前者传播到后者。如果我们等待足够长的时间,会有一些人(这些人由第一个感染者确定)被感染;这些人的数量被称作最终被感染的人数。
阿强希望求出最终被感染的人数的最小和最大可能的值,也就是最好和最坏情况下这个数的值。
输入描述:
第一行包含一个整数T(1≤T≤2,000)(1≤T≤2,000),表示数据组数。接下来是T组数据。 •每组数据的第一行包含一个整数N(2≤N≤8)(2≤N≤8)。 •第二行包含N个整数x_1,x_2, \dots, x_n (0≤x_i≤10)x1,x2,…,xn(0≤xi≤10),用空格隔开。
输出描述:
对于每组数据,输出一行包含两个整数,用空格隔开,表示最终被感染的人数的最小值和最大值。
示例1
输入
复制
3 2 3 6 3 1 3 5 5 1 2 5 6 7
输出
复制
1 1 3 3 2 3
思路:本题数据不大,可以排序后枚举找出最小和最大的感染数
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin=new Scanner(System.in);
int t=cin.nextInt();
while(t-->0) {
int n=cin.nextInt();
int a[]=new int[n];
for(int i=0;i<n;i++)a[i]=cin.nextInt();
int min=Integer.MAX_VALUE,max=Integer.MIN_VALUE;
Arrays.sort(a);
int cnt=1;//用来记录当前区间最大感染人数
for(int i=1;i<n;i++) {
if(a[i]-a[i-1]<=2)cnt++;
else {
min=Math.min(min, cnt);
max=Math.max(max, cnt);
cnt=1;
}
}
min=Math.min(min, cnt);
max=Math.max(max, cnt);
System.out.println(min+" "+max);
}
}
}
阿强与网格
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
阿强在一个N行M列的网格中。
阿强可以用两种方式移动:
向下、向左、向上或向右移动,每次移动的代价为X。换句话说,如果您位于网格的单元格(i,j),则可以转到任意单元格(i+1,j),(i,j−1) ,(i−1,j)或(i,j+1),代价为X。
沿对角线向左下、向右下、向左上、向右上移动成本为Y。换句话说,如果你在网格的单元格(i,j)上,你可以去任意一个单元格(i+1,j−1) ,(i+1,j+1),(i−1,j−1) 或(i−1,j+1),代价为Y。
请你找到从阿强从左上角(1,1)到右下角(N,M)的最小成本。
阿强不能移出网格。
输入描述:
第一行一个整数T(1≤T≤5∗105)(1\leq T \leq 5*10^5)(1≤T≤5∗105)表示数据组数。
接下来T行每行四个整数N,M,X,Y(1≤N,M,X,Y≤106)(1 \leq N,M,X,Y \leq 10^6)(1≤N,M,X,Y≤106)
输出描述:
对于每组数据一行表示答案。
示例1
输入
复制3 5 6 2 5 4 7 5 6 7 8 6 5
3 5 6 2 5 4 7 5 6 7 8 6 5
输出
复制18 33 36
18 33 36
思路:本题可以通过数学方法来计算:
1.首先判断是走折线还是直线,判断条件: