#P2758. 第1题-小美的生物钟
          
                        
                                    
                      
        
              - 
          
          
                      1000ms
            
          
                      Tried: 77
            Accepted: 37
            Difficulty: 2
            
          
          
          
                       所属公司 : 
                              美团
                                
            
                        
              时间 :2025年3月29日-算法岗
                              
                      
          
 
- 
                        算法标签>数学          
 
第1题-小美的生物钟
问题分析
给定一个长度为 n 的数组 a,以及一个阈值 k。我们需要判断数组的平均值(向上取整后)是否大于 k。如果平均值大于 k,则输出 “NO”;否则输出 “YES”。
解题思路
- 读取 T 表示测试用例的数量。
 - 对于每个测试用例:
- 读取 n、k。
 - 读取数组 a(长度为 n)。
 - 计算数组的元素和 
S = sum(a)。 - 通过 
(S + n - 1) // n得到平均值的向上取整(5.6 -> 6, 5.0 -> 5)。 - 比较该结果与 k:若大于 k,则输出 “NO”;否则输出 “YES”。
 
 
该方法本质上只需要一次遍历来求和,后续操作均为 O(1),因此在处理单个测试用例时的时间复杂度为 O(n)。
复杂度分析
- 时间复杂度:对每个测试用例,我们需要 O(n) 来计算数组元素之和。若共有 T 个测试用例,则总时间复杂度为 O(T * n)。
 - 空间复杂度:只需要存储 n 个整数的数组 a,空间复杂度为 O(n)。
 
代码实现
下面分别给出 Python、Java、C++ 的参考代码,均包含简要中文注释。
Python 实现
def solve():
    import sys
    input_data = sys.stdin.read().strip().split()
    T = int(input_data[0])
    index = 1
    
    for _ in range(T):
        n = int(input_data[index]); index += 1
        k = int(input_data[index]); index += 1
        
        a = list(map(int, input_data[index:index+n]))
        index += n
        
        # 计算数组总和
        total = sum(a)
        # 计算向上取整的平均值
        ave = (total + n - 1) // n
        
        # 比较并输出结果
        if ave > k:
            print("NO")
        else:
            print("YES")
Java 实现
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();  // 测试用例数量
        
        while(T-- > 0) {
            int n = sc.nextInt();  // 数组长度
            int k = sc.nextInt();  // 阈值 k
            
            int[] a = new int[n];
            long sum = 0;  // 用 long 防止可能的整数溢出
            for(int i = 0; i < n; i++){
                a[i] = sc.nextInt();
                sum += a[i];
            }
            
            // 计算向上取整平均值
            // (sum + n - 1) / n 等价于对 sum / n 进行向上取整(当 sum > 0)
            long ave = (sum + n - 1) / n;
            
            // 判断并输出结果
            if(ave > k){
                System.out.println("NO");
            } else {
                System.out.println("YES");
            }
        }
        
        sc.close();
    }
}
C++ 实现
#include <bits/stdc++.h>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int T;
    cin >> T;  // 读取测试用例数量
    while(T--){
        long long n, k;
        cin >> n >> k;  // n 为数组长度,k 为阈值
        
        vector<long long> a(n);
        long long sumA = 0; // 存储数组元素和
        
        for(int i = 0; i < n; i++){
            cin >> a[i];
            sumA += a[i];
        }
        
        // 计算向上取整平均值
        // (sumA + n - 1) // n 等价于对 sumA / n 的向上取整
        long long ave = (sumA + n - 1) / n;
        
        // 比较并输出
        if(ave > k){
            cout << "NO\n";
        } else {
            cout << "YES\n";
        }
    }
    return 0;
}
        题目内容
小美工作得很累,现在已经是深夜,她的生物钟已经乱了!
为了身体健康,她决定现在开始调整自己的生物钟。
现在给定 n 天小美的工作时间,她认为作息是规律的当且仅当每天的工作时间不能超过 k 。
可是由于工作需要,她每灭需要工作 ai 。
为了身体健康,她决定在工作总时长不变的情况调休,即某天的工作量可以在另外一天完成。
现在她想知道能不能完成调休使得作息是规律的,请你帮她计算一下。
输入描述
每个测试文件均包含多组测试数。第一行输入一个整数 T(1≤7≤1000),代表数据组数,每组测试数据描述如下:
对于每一组测试数据:
第一行两个整数
n,k(1≤n≤105,1≤k≤24),表示工作人数和作息规律的时长限制。
第二行 n 个整数,第 i 个数为 ai(1≤ai≤24) 表示工作时长。
数据保证单个测试文件中∑n≤105
输出描述
、
共 T 行,每行一个字符串,若能完成调体使得作息是规律的,输出"YES",否则输出"NO”。
样例1
输入
2
1 2
2
1 2
3
输出
YES
NO