题目描述
逛完美丽的校园,HJ发觉自己还有毕业设计没有做完,苦逼的HJ准备了n天的时间来完成他的毕业设计,按他的设想, 计划中的时间将在课设前端, 课设后端, 娱乐, 这三件事中度过;
他进行了项目排期, 他不会两天连续做前端或做后端, 只有当排期为第i天做前端时, 他才在第i天做前端, 当排期为第i天做后端时, 他才在第i天做后端, 他一天只能做一件事, 要么前端, 要么后端, 要么娱乐;
现在随机生成n天计划的排期, 求HJ最少能娱乐几天。
输入
第一行一个整数 n, n(1≤n≤100000) 表示天数n;
第二行 n 个数 每个数为0或1,第 i 个数表示hj在第 i 天是否能做前端(1为能做前端, 0为不能做前端);
第三行 n 个数 每个数为0或1,第 i 个数表示hj在第i天是否能做后端(1为能做后端, 0为不能做后端);
输出
一个整数, 表示hj最小娱乐天数。
样例输入
5
0 1 1 0 0
0 0 1 1 0
提示
HJ可在第一天休息, 第二天做前端, 第三天或第四天做后端(第三天或第四天一天休息), 第五天休息, 最少休息三天。
相关代码
#include <stdio.h>
int main()
{
int n,a[100000],b[100000],i,t=0,sum=0;//sum表示最大休息天数;
scanf("%d",&n); //数据输入
for(i=0;i<n;i++){
scanf("%d",&a[i]);//数据输入
}
for(i=0;i<n;i++){
scanf("%d",&b[i]);//数据输入
}
for(i=0;i<n;i++){ //t是用来判断前一天时间安排
if(t==1){ //t=1,前一天做前端;t=2,前一天做后端;
if(b[i]==1){
t=2;continue;
}
else{
sum++;t=0;
}
}
else if(t==2){
if(a[i]==1){
t=1;continue;
}
else{
t=0;sum++;
}
}
else{ //当a[i]和b[i]均为1且t=0时,可随机选择做前端或者做后端,t不变,此处省略;
if(a[i]==1&&b[i]==0)t=1;
else if(a[i]==0&&b[i]==1)t=2;
else if(a[i]==0&&b[i]==0)sum++;
}
}
printf("%d\n",sum);
return 0;
}
样例输出
3