#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