题目:

抉择

题目解析

看注释

代码

#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;
}