OD统一考试(C卷)
分值: 100分
题目描述
在一个大型体育场内举办了一场大型活动,由于疫情防控的需要,要求每位观众的必须间隔至少一个空位才允许落座。现在给出一排观众座位分布图,座位中存在已落座的观众,请计算出,在不移动现有观众座位的情况下,最多还能坐下多少名观众。
输入描述
一个数组,用来标识某一排座位中,每个座位是否已经坐人。0表示该座位没有坐人,1表示该座位已经坐人。
输出描述
整数,在不移动现有观众座位的情况下,最多还能坐下多少名观众。
示例1
输入:
10001
输出:
1
示例2
输入:
0101
输出:
0
备注
1 <= 数组长度 <= 10000
题解
通过贪心模拟的方法,遍历座位数组,统计连续的空座位并计算最多还能坐下多少名观众。在每次迭代中,检查当前座位及其相邻座位的状态,如果当前座位为空且两侧也为空,则可坐下一名观众。最后输出结果。
C++
#include <iostream>
#include <vector>
using namespace std;
int main() {
string seat;
cin >> seat;
int result = 0, n = seat.length();
// pre 用于表示前一个座位的状态, 0表示该座位没有坐人,1表示该座位已经坐人
char pre = '0';
for(int i = 0; i < n; i++) {
// seat[i] 没有人座 且两边都没有人座
if(pre == '0' && seat[i] == '0' and (i + 1 == n or seat[i+1] == '0')) {
result++;
pre = '1';
continue;
}
pre = seat[i];
}
cout << result << endl;
return 0;
}
Java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String seat = scanner.next();
int result = 0, n = seat.length();
// pre 用于表示前一个座位的状态, 0表示该座位没有坐人,1表示该座位已经坐人
char pre = '0';
for (int i = 0; i < n; i++) {
// seat[i] 没有人座 且两边都没有人座
if (pre == '0' && seat.charAt(i) == '0' && (i + 1 == n || seat.charAt(i + 1) == '0')) {
result++;
pre = '1';
continue;
}
pre = seat.charAt(i);
}
System.out.println(result);
}
}
Python
seat = input().strip()
result, n = 0, len(seat)
# pre 用于表示前一个座位的状态, 0表示该座位没有坐人,1表示该座位已经坐人
pre = '0'
for i in range(n):
# seat[i] 没有人座 且两边都没有人座
if pre == '0' and seat[i] == '0' and (i + 1 == n or seat[i + 1] == '0'):
result += 1
pre = '1'
continue
pre = seat[i]
print(result)
🙏整理题解不易, 如果有帮助到您,请给点个赞 ❤️ 和收藏 ⭐,让更多的人看到。🙏🙏🙏