列表

详情


NC229576. 传染病统计

描述

阿强来到大街上,街上有 N 个人,编号为 1 ∼N 。简单起见,我们把每个人都看成一条线上的一个点。对每个合法的 i,第 i 个人的位置是 x_i
这些人当中恰好有一个感染了 COVID-19,但我们不知道是哪一个。当一个被感染的人和一个未被感染的人之间的距离不超过 2 时,病毒会从前者传播到后者。如果我们等待足够长的时间,会有些人(这些人由第一个感染者确定)被感染;这些人的数量被称作最终被感染的人数
阿强希望求出最终被感染的人数的最小和最大可能的值,也就是最好和最坏情况下这个数的值。

输入描述

第一行包含一个整数T,表示数据组数。接下来是T组数据。
•每组数据的第一行包含一个整数N
•第二行包含N个整数,用空格隔开。

输出描述

对于每组数据,输出一行包含两个整数,用空格隔开,表示最终被感染的人数的最小值和最大值。

示例1

输入:

3
2
3 6
3
1 3 5
5
1 2 5 6 7

输出:

1 1
3 3
2 3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 297ms, 内存消耗: 29352K, 提交时间: 2021-10-29 12:24:02

for _ in range(int(input())) :
    n = int(input())
    x = list(map(int, input().split()))
    x.sort()
    mx, mi, l = 1, float('inf'), 1
    for i in range(1, len(x)) :
        if x[i] - x[i - 1] <= 2 :
            l += 1
        else :
            mx = max(l, mx)
            mi = min(l, mi)
            l = 1
    mx = max(l, mx)
    mi = min(l, mi)
    print(mi, mx)

C++ 解法, 执行用时: 9ms, 内存消耗: 564K, 提交时间: 2022-04-05 21:40:40

#include<bits/stdc++.h>
using namespace std;
int t,n;
int p[100005];
void solve()
{
	scanf("%d",&n);
	int lst=-100,num=0;
	for(int i=1;i<=n;i++){
		int x;
		scanf("%d",&x);
		if(x-lst>2)	p[++num]=1;
		else	p[num]++;
		lst=x;
	}
	sort(p+1,p+num+1);
	printf("%d %d\n",p[1],p[num]);
 } 
int main()
{
	scanf("%d",&t);
	while(t--)	solve();
	return 0;
}

Python3 解法, 执行用时: 84ms, 内存消耗: 4732K, 提交时间: 2022-02-22 17:57:32

for _ in range(int(input())):
    n=int(input())
    x=list(map(int,input().split()))
    vec=[]
    cnt=1
    for i in range(n-1):
        if x[i]+2>=x[i+1]:
            cnt+=1
        else:
            vec.append(cnt)
            cnt=1
    vec.append(cnt)
    print(min(vec),max(vec))

上一题