Files
iroute/test/algorithm/1052.dart
toly 8fb4bf57d6 v8
2023-11-08 09:35:29 +08:00

104 lines
4.1 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/// 1052. 爱生气的书店老板
//有一个书店老板,他的书店开了 n 分钟。每分钟都有一些顾客进入这家商店。
// 给定一个长度为 n 的整数数组 customers
// 其中 customers[i] 是在第 i 分钟开始时进入商店的顾客数量,所有这些顾客在第 i 分钟结束后离开。
// 在某些时候,书店老板会生气。 如果书店老板在第 i 分钟生气,那么 grumpy[i] = 1
// 否则 grumpy[i] = 0。 当书店老板生气时,那一分钟的顾客就会不满意,若老板不生气则顾客是满意的。
// 书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续 minutes 分钟不生气,但却只能使用一次。
// 请你返回 这一天营业下来,最多有多少客户能够感到满意 。
//
//输入customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], minutes = 3
// 输出16
// 解释:书店老板在最后 3 分钟保持冷静。
// 感到满意的最大客户数量 = 1 + 1 + 1 + 1 + 7 + 5 = 16.
//
// 算法思想:
// 因为有X分钟可以控制情绪所以这X分钟要用在关键的时间段也就是需要知道哪个长度为X的时间段不满意的客人最多。
// 最多满意客户数量 = 原本就满意的客户 + X时间段内因为控制了情绪而态度反转的最多客户数量
//
// 算法步骤:
//
// 统计老板不生气时的客人数量;
// 利用长度为X的滑动窗口统计长度为X的时间段内不满意的客户最多数量是多少
import 'dart:math';
void main() {
List<int> customers = [4, 6, 3, 8, 7, 2, 6];
//1生气 0不气
List<int> grumpy = [1, 0, 1, 1, 0, 1, 0];
//最大不满数 3+8
// 没有魔法时满意数 6+7+6 = 19
//拥有魔法 6+3+8+7+6 =30
int magic = 2;
maxSatisfied(customers, grumpy, magic);
}
// int maxSatisfied(List<int> customers, List<int> grumpy, int minutes) {
// int m = customers.length;
// int total = 0;
// // 统计不生气时间内的客人总数
// for (int i = 0; i < m; i++) {
// if (grumpy[i] == 0) {
// total += customers[i];
// }
// }
// int curAngry = 0; // 长度为X的时间段内不满意的客人数
// // 统计第一个大小为X的窗口内不满意的客人数
// for (int i = 0; i < minutes; i++) {
// curAngry += customers[i] * grumpy[i];
// }
// int maxAngry = curAngry; // 所有窗口时间段内,遇到不满意的客人的最多数量
// // 滑动窗口统计max_angry
// for (int i = minutes; i < m; i++) {
// curAngry += customers[i] * grumpy[i]; // 只把不满意的客人数量加进来
// curAngry -= customers[i - minutes] * grumpy[i - minutes]; // 只减去不满意客人数量
// maxAngry = max(maxAngry, curAngry); // 更新窗口内的不满意客人数量
// }
// // 总满意人数 = 本来就满意的人数 + 老板抑制情绪的时间段内不满意变为满意的人数
// return total + maxAngry;
// }
///最大满意人数
int maxSatisfied(List<int> customers, List<int> grumpy, int minutes) {
int maxSatisNumber = 0;
int maxUnSatisNumber = 0;
int unSatisNumber = 0;
//先算第一个窗口不满意人数
for (int i = 0; i < minutes; i++) {
if (grumpy[i] == 1) {
maxUnSatisNumber += customers[i];
unSatisNumber = maxUnSatisNumber;
}
}
//格口向后移动
for (int i = minutes; i < customers.length; i++) {
//减去前一个格口不满数 加上后一个格口不满数
if (grumpy[i - minutes] == 1) {
if (grumpy[i] == 1) {
unSatisNumber = unSatisNumber - customers[i - minutes] + customers[i];
} else {
unSatisNumber = unSatisNumber - customers[i - minutes] + 0;
}
} else {
if (grumpy[i] == 1) {
unSatisNumber = unSatisNumber - 0 + customers[i];
} else {
unSatisNumber = unSatisNumber - 0 + 0;
}
}
maxUnSatisNumber = max(maxUnSatisNumber, unSatisNumber);
}
print("最大不满意数$maxUnSatisNumber");
for (int i = 0; i < customers.length; i++) {
if (grumpy[i] == 0) {
maxSatisNumber += customers[i];
}
}
maxSatisNumber = maxSatisNumber + maxUnSatisNumber;
print("最大满意数$maxSatisNumber");
return maxSatisNumber;
}