翘课行动

版权声明:Copyright © 钟波 https://blog.csdn.net/gzu_zb/article/details/89815481

题目链接:https://nanti.jisuanke.com/t/A1053

题目

自从上了大学,苏苏就学会了翘课=。=!但是,他在翘课时还是有所选择的,某些课程,跪着也要听完啊。现在,给出某天的课程序列,用1表示一门重要的课程,用0表示一门不太重要的课程。苏苏总是按照如下规则来翘课:

  1. 绝不敲重要课程,never!;
  2. 在第一节重要课程之前的所有课全部敲掉;
  3. 若有两节或两节以上的非重要课程相连,则这些非重要课程全部敲掉;
  4. 最后一节重要课程之后的课全部敲掉;
  5. 若当天没有重要课程,就敲掉全部课程。

在这样一种先进翘课思想的指导下,苏苏每天能上多少节课呢?

输入:

首先输入正整数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;
	}
}

猜你喜欢

转载自blog.csdn.net/gzu_zb/article/details/89815481