2021辽宁省大学生程序设计大赛部分题解

传染病统计

题目描述

阿强来到大街上,街上有 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.首先判断是走折线还是直线,判断条件:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值