列表

详情


MT26. 改考卷

描述

在上小学的时候,我们经常碰到这样的事:考完试后老师懒得改试卷,于是让我们同桌相互交换试卷后为对方批改。但是后来老师发现这样作容易出现作弊,于是他想了一个新办法。 老师将同学分成了 n 个组,其中编号为 𝑖 的组中有 𝑠𝑖 个人。然后老师会按某种顺序依次访问 这些组。 对于他访问的第一个组,他会将这组内的所有试卷都收走,放置在桌上;对于他后续访问的每一个组,首先他会从桌上的试卷最上方拿出该组对应人数数量的试卷,随机分配给该组每 个人一张试卷让他们进行批改,而后再将这组学生自己考的试卷收走放置在桌面试卷的最下方。当他访问完所有的组后他会将桌面上剩余的所有试卷随机分配给他第一个访问的组的学生进行批改。 但他发现这种方法有时候也会出现问题:有可能在中途访问到某个组的时候桌面上的试卷不够分配给这组学生每人一张;也有可能最后会有学生分配到批改自己的试卷,而且这两种情 况是否出现是与他访问每个组的顺序有关的。现在他想知道是否存在一种访问顺序能够使以 上两种情况都不出现,顺利完成试卷批改呢?

数据范围:

输入描述

第一行包含一个整数𝑛,表示学生组数。
第二行包含𝑛个整数,𝑠1,𝑠2,...,𝑠𝑛,分别表示每组学生的人数。

输出描述

若存在一种访问顺序能使试卷顺利批改完成,输出 Yes,否则输出 No。

示例1

输入:

2
10 20

输出:

No

说明:

如果以 10 20 的顺序访问,则在第二组的时候作业不够第二组分,如果以 20 10 的顺序访问,则分给 20 人组的作业中有 10 本是本组的

示例2

输入:

4
2 3 3 1

输出:

Yes

说明:

我们可以选择先访问人数为 3 的组,再访问人数为 3 的组,再访问人数
为 1 的组,最后访问人数为 2 的组。

原站题解

C++14 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2020-07-28

#include <stdio.h>
#include <stdlib.h>
 
int main(void) {
    int n,i,maxi,max=0,sum=0;
    scanf("%d",&n);
    int a[n];
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        sum+=a[i];
        if(a[i]>max)
        {
            max=a[i];
            maxi=i;
        }
    }
    sum-=max;
    if(max>sum)
        printf("No");
    else
        printf("Yes");
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 376KB, 提交时间: 2020-06-29

#include <stdio.h>
#include <stdlib.h>

int main(void) {
	int n,i,maxi,max=0,sum=0;
	scanf("%d",&n);
	int a[n];
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
		sum+=a[i];
		if(a[i]>max)
		{
			max=a[i];
			maxi=i;
		}
	}
	sum-=max;
	if(max>sum)
		printf("No");
	else
		printf("Yes");
	return 0;
}