版权声明:Copyright © 钟波 https://blog.csdn.net/gzu_zb/article/details/89815481
题目链接:https://nanti.jisuanke.com/t/A1053
题目
自从上了大学,苏苏就学会了翘课=。=!但是,他在翘课时还是有所选择的,某些课程,跪着也要听完啊。现在,给出某天的课程序列,用1表示一门重要的课程,用0表示一门不太重要的课程。苏苏总是按照如下规则来翘课:
- 绝不敲重要课程,never!;
- 在第一节重要课程之前的所有课全部敲掉;
- 若有两节或两节以上的非重要课程相连,则这些非重要课程全部敲掉;
- 最后一节重要课程之后的课全部敲掉;
- 若当天没有重要课程,就敲掉全部课程。
在这样一种先进翘课思想的指导下,苏苏每天能上多少节课呢?
输入:
首先输入正整数T(T<=150),表示测试的组数。接下来每组测试数据均包含两行。第一行是一个正整数n(1<=n<=1000),表示某天的课程总数,第二行有n个整数(只为0或1),表示这n门课程的重要程度。
输出:
对于每一组测试数据,输出苏苏能上的课的节数。
样例输入复制
2
5
0 1 0 1 1
7
1 0 1 0 0 1 0
样例输出复制
Case #1:4
Case #2:4
题解
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
for (int k = 1; k <= n; k++) {
int num;
cin >> num;
int *p = new int[num];
for (int i = 0; i < num; i++)
cin >> p[i];
int ans = 0;
bool flag = false;//用于标记连续出现的是否为0
int midof_0 = 0;//统计中间0的个数
for (int i = 0; i < num; i++) {
if (p[i] == 0 && !flag) {//出现连续的0,继续往下寻找
continue;
}
if (p[i] == 1) {
flag = true;
ans++;
if (midof_0 == 1) {//说明两个1之间刚好有一个0,不能翘课
ans++;
midof_0 = 0;//注意归0
}
else {
midof_0 = 0;
}
}
else {
midof_0++;//在中间0的个数加1
}
}
cout << "Case #" << k << ":" << ans << endl;
}
}