改试卷(美团点评)

题目描述

学生分为n组,每个组si个人,老师收取第一组所有试卷,发给第二组同学,同时收取第二组同学的试卷放在手中试卷的底下………一直到收取最后一组试卷,再将手中试卷发给第一组学生。

这样存在两个问题:1,手中试卷不够发给下一组同学的;2,有的同学改自己的试卷

这两个问题与老师收取试卷的顺序有一定关系,你能否设计老师收取试卷的顺序从而避免上述两个问题,若存在一定顺序,输出“Yes”,否则,输出“No”。

输入:

第一行:分组个数
第二行:每个组的学生数

输出:

能满足条件:Yes
不能满足条件:No

输入样例:

2
20 10

4
1 3 2 3

输出样例:

No
Yes

tips:样例2的顺序为3 3 1 2 时就可以避免这两个问题。

分析过程

首先,来看一个会分配失败的案例,我们先排个序,按照卷子多的先入队:

也就是说,如果卷子最多的那一组,比其他所有组卷子总和加起来还要多的话,那就肯定发卷失败,多的那一组发卷子到最后会遇到自己组的卷子。所以,判定条件就是:

排序后,卷子最多的那组不能比其他所有组卷子总数还要多!

当然还有些边界条件需要注意,比如只有两组的话,这两组卷子数目肯定要一样才行。

解题代码

#include <iostream>
#include <algorithm>

using namespace std;

void showArr(int a[], int n){
    cout << "arr :[ ";
    for (int i = 0; i < n; i++)
        cout << a[i] << " ";
    cout << "]" << endl;
}

int main(){

    int n;
    while (cin >> n){

        // 异常处理
        if (n <= 0){
            cout << "输入的n有误,请重新输入:" << endl;
            continue;
        }

        int *s = new int[n];

        for (int i = 0; i < n; i++){
            cin >> s[i];
        }

        // 排序
        sort(s, s + n);

        showArr(s, n);
        if (n == 2 && s[0] == s[1])
            cout << "Yes" << endl;
        else if (n == 2 && s[0] != s[1]
            || n == 1){
            cout << "No" << endl;
        }
        else {
            int sum = 0;
            for (int i = 0; i < n - 1; i++)
                sum += s[i];

            if (sum < s[n - 1])
                cout << "No" << endl;
            else
                cout << "Yes" << endl;
        }
    }
    return EXIT_SUCCESS;
}

结果:

7
7 2 3 2 9 1 10
arr :[ 1 2 2 3 7 9 10 ]
Yes
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值