2023莆田暑期集训CSP-J Day7——3、时间安排

题目描述

小T作为班级的班长,承担着班级的各项事务,今天班主任交给了小T一个重要的任务,学校的音乐会就要开始了,要小T帮忙协助音乐会的举办,但是小T依然有自己的学业安排,小T想兼顾自己学业的同时协助音乐会的开展,音乐会还有n天举行,在这n天里,每天可能有4种状态:

  1. 这天没有学业的课程任务,也没有音乐会的任务。
  2. 这天没有学业的课程任务,有音乐会的任务。
  3. 这天有学业的课程任务,但没有音乐会的任务。
  4. 这天有学业的课程任务,也有音乐会的任务。

小T每天可以选择休息,或者完成学业任务(前提这天有),或者完成音乐会的任务(前提这天有),小T不希望连续2天同时做学业任务或者同时做音乐会的任务,小T同时又对自己很严格,小T想知道在这样的要求下,小T最少能够休息多少天,这个问题太难了,小T才小学一年级,还算不过来,需要你帮帮他。

输入格式

第一行一个整数n表示天数。

第二行用空格隔开的n个整数ai表示这天的状态。

输出格式

第一行一个数字表示最少的休息天数。

样例数据
样例输入#1
4
1 3 2 0
样例输出#1
2
数据范围

对于30%的数据,1≤n≤10。

对于50%的数据,1≤n≤1000。

对于100%的数据,1≤n≤100000,0≤ai≤3。

---------------------------------------------------------------------------------------------------------------------------------

这道题的话,我们不需要去想什么复杂的代码

我们看一下,解决这道题的关键是用最优的方法来做作业和做音乐作业,那什么情况下我们要考虑最优解呢?似乎只有在连续两天有学业的课程任务,也有音乐会的任务,只有在这个时候,我们才要考虑一下今天做什么,明天才不会休息(其他情况都不用考虑最优解,比如连续两天都有作业,那肯定有一天休息,没有最优解)

所以,这道题的思路很简单,我们只需要把数组a遍历一遍,看看那些天要休息,直接休息

---------------------------------------------------------------------------------------------------------------------------------

#include<bits/stdc++.h>
using namespace std;
typedef long long l;//将long long改成l,只要写l就表示long long 
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	//普通的加速 
	int n;
	int a[114514],q=0,w=0,s=0;
	cin>>n;
	//有n个人,用数组a来存储 
	for(int i=1; i<=n; i++) {
		cin>>a[i];//读入 
	}
	for(int i=1; i<=n; i++) {
		if(a[i]==0) {//如果今天什么作业也没有 
			s++;//那只能休息了,用s代表休息天数 
			q=0;
			w=0;
			/*用q代表音乐会的任务,用w代表学业任务 
			如果q==0,说明没有连续两天做音乐会的任务,现在就可以做音乐会的事 
			如果w==0,说明没有连续两天做学业的任务,现在就可以做学业的事 
			如果q==1,说明没有昨天在做音乐会的任务,今天不能做 
			如果w==1,说明没有昨天在做学业的任务,今天不能做 
			不管q和w是0还是1,过完今天,他们肯定都可以等于0
			(因为今天在休息,就算昨天在做什么,今天休息完肯定能继续做) 
			*/
		} else if(a[i]==1) {//如果只有音乐会的任务 
			if(q==0) {//如果昨天没做音乐 
				q++;//将音乐变成1 
				w=0;//由于今天没做学业,今天过完学业肯定能做 
			} else {//否则就是昨天做了音乐 
				s++;//休息次数++ 
				q=0;//跟上面一样,不多介绍 
				w=0;
			}
		} else if(a[i]==2) {//如果只有学业 
			if(w==0) {
				w++;//学业=1 
				q=0;//音乐休息完成 
			} else {
				s++;//否则就做不了学业 
				q=0;
				w=0;
			}
		} else {//否则就是比较麻烦的,又有音乐,又有学业 
			if(q==1) {
				w++;
				q=0;//如果音乐做了,今天只能做学业 
			} else if(w==1) {
				q++;//如果学业做了,今天只能做音乐 
				w=0;
			} else {
				q++;//否则就是q和w都等于0,那就做音乐 
				q=0;//这行我也不太懂,如果去掉就WA了
                //如果有哪位大神看懂了评论区给我讲一下好吗?球球了
			}
		}
	}
	cout<<s;//输出答案 
	return 0;
}

我真的看不懂q=0啊,脑袋都要炸了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值