This commit is contained in:
toly
2023-11-08 09:35:29 +08:00
parent 88cd6fb3b4
commit 8fb4bf57d6
78 changed files with 4344 additions and 544 deletions

104
test/algorithm/1052.dart Normal file
View File

@@ -0,0 +1,104 @@
/// 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;
}