- lizexuan's blog
liwenfang002抉择
- 2023-6-9 17:49:57 @
题目:
题目解析
看注释
代码
#include <bits/stdc++.h>
using namespace std;
int k, n, Pre_index, Post_index; // k指膀胱饱和度, n是人数, 另外两个是最长连续空位的前后索引
bool lavatory[10000 + 1] = {0}; // 位置
int mcs, pres, posts; // 最长连续空位的长度、左边几个人、右边几个人
int Maximum_consecutive_seat () { // 计算最长连续空位的长度
int maxMcs = 0, spareMcs = 0; // 最长连续空位、备用计算的
lavatory[n + 1] = 1; // 防止全是空位
for (int i = 1; i <= n + 1; i++) {
if (lavatory[i] == 0) { // 如果没人++
spareMcs++;
} else if (lavatory[i] == 1) { //有人时
if (maxMcs < spareMcs) { // 如果大
maxMcs = spareMcs;
Pre_index = i - maxMcs - 1; // 这俩不讲了
Post_index = i;
}
spareMcs = 0;
}
}
return maxMcs;
}
int statistics (int pre, int post) { // 算区间内多少人 dddd
int cnt = 0;
for (int i = pre + 1; i < post; i++) {
if (lavatory[i] == 1) {
cnt++;
}
}
return cnt;
}
int main() {
cin >> k;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> lavatory[i];
}
// 输入
mcs = Maximum_consecutive_seat(), pres = statistics(1, Pre_index + 1), posts = statistics(Post_index - 1, n + 1); // 没啥说的
if (mcs == n) { // 如果最长连续空位正好为n说明全是空位
cout << 1 << endl; // 坐第一个
return 0;
}
if (mcs >= 3) { // 如果最长连续空位≥3
if (pres == 0) { // 如果左边没人就去第一个
cout << 1 << endl;
return 0;
} else if (posts == 0) { // 如果右边没人
cout << n << endl; // 坐最后一个
return 0;
} else {
cout << (Post_index + Pre_index) / 2 << endl; // 输出中间位置可避免输出的不是最小的
return 0;
}
}
if (mcs == 2) {
if (k < 50) { // 只有两个位置但膀胱饱和度没到50
cout << "Back" << endl; // 回classroom ing~
return 0;
} else {
if (posts != pres) {
cout << ((posts > pres) ? Pre_index : Post_index - 1) << endl; // 那边人少去那边
// Post_index的位置是最长连续空位的末尾的后面一个数所以要减一
} else {
cout << Pre_index << endl;
} // 因为两边人一样多输出左边
return 0;
}
}
if (mcs == 1) {
if (k < 50) {
cout << "Back" << endl; // 只有一个座位但膀胱饱和度没到50
return 0; // 回去好好学习
}
cout << Pre_index << endl; // 只有一个输出Pre_index还是Post_index都一样,但是Post_index还要减一
return 0;
}
if (mcs == 0) {
cout << "Back" << endl; // 没位置只能回去啊...
return 0;
}
return 0;
}