题目描述
2024华为OD-E卷-100分-免单统计
某餐厅推出了一项优惠活动:每位顾客在餐厅消费满200元,即可获得一次免单抽奖机会。抽奖的规则是从一个装有红球和白球的箱子中随机抽取一个球,如果抽到红球则免单,抽到白球则不免单。已知箱子里红球和白球的比例是1:N(N表示白球数量是红球数量的N倍)。现在给你餐厅某天的顾客消费记录以及红球与白球的比例N,请你统计出该天免单的人数。
输入
输入的第一行为两个整数:M和N(1 ≤ M ≤ 10000,1 ≤ N ≤ 100),分别表示顾客数量和红球与白球的比例。
接下来M行,每行一个整数表示每位顾客的消费金额(单位:元,1 ≤ 消费金额 ≤ 1000)。
输出
输出一个整数,表示该天免单的人数。
示例
输入
5 2
150
220
300
400
250
输出
1
思路分析
- 读取输入:首先读取顾客数量M和红球与白球的比例N。然后读取M个顾客的消费金额。
- 判断免单资格:每位顾客如果消费金额大于等于200元,则获得一次抽奖机会。
- 模拟抽奖:对于每位获得抽奖机会的顾客,按照红球与白球的比例N随机决定其是否免单。具体实现可以通过生成一个随机数,如果这个随机数小于等于1/(N+1),则视为抽到红球,免单人数加一。
- 输出结果:最后输出免单的人数。
Java编码解析
import java.util.Scanner;
import java.util.Random;
public class FreeMealStatistics {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取M和N
int M = scanner.nextInt();
int N = scanner.nextInt();
int freeMeals = 0;
Random random = new Random();
// 读取每位顾客的消费金额
for (int i = 0; i < M; i++) {
int consumption = scanner.nextInt();
if (consumption >= 200) {
// 模拟抽奖
if (random.nextDouble() <= 1.0 / (N + 1)) {
freeMeals++;
}
}
}
// 输出免单人数
System.out.println(freeMeals);
scanner.close();
}
}
C++编码解析
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main() {
int M, N;
cin >> M >> N;
int freeMeals = 0;
srand(time(0)); // 初始化随机数种子
for (int i = 0; i < M; i++) {
int consumption;
cin >> consumption;
if (consumption >= 200) {
// 模拟抽奖
if (static_cast<double>(rand()) / RAND_MAX <= 1.0 / (N + 1)) {
freeMeals++;
}
}
}
// 输出免单人数
cout << freeMeals << endl;
return 0;
}
Python编码解析
import random
# 读取输入
M, N = map(int, input().split())
consumptions = list(map(int, input().strip().split()))
free_meals = 0
# 判断每位顾客是否免单
for consumption in consumptions:
if consumption >= 200:
# 模拟抽奖
if random.random() <= 1 / (N + 1):
free_meals += 1
# 输出免单人数
print(free_meals)