题目
题目描述
逛完美丽的校园,HJ发觉自己还有毕业设计没有做完,苦逼的HJ准备了n天的时间来完成他的毕业设计,按他的设想, 计划中的时间将在课设前端,
课设后端, 娱乐, 这三件事中度过,;他进行了项目排期, 他不会两天连续做前端或做后端, 只有当排期为第i天做前端时, 他才在第i天做前端, 当排期为第i天做后端时,
他才在第i天做后端, 他一天只能做一件事, 要么前端, 要么后端, 要么娱乐,;现在随机生成n天计划的排期, 求HJ最少能娱乐几天。
输入
第一行一个整数 n, n(1≤n≤100000) 表示天数n;
第二行 n 个数 每个数为0或1,第 i 个数表示hj在第 i 天是否能做前端(1为能做前端, 0为不能做前端);
输出
一个整数, 表示hj最小娱乐天数。
提示
样例输入输出
输入
5
0 1 1 0 0
0 0 1 1 0
输出
3
解释
HJ可在第一天休息, 第二天做前端, 第三天或第四天做后端(第三天或第四天一天休息), 第五天休息, 最少休息三天。
题解
这题用动规 应该更好做,奈何俺不会,俺也听不懂,还是在师父的悉心指导与帮助下用模拟写出来了 .0_0.
题目分析
- 首先分析每一天的状态,细分的话每一天都有四个状态,00、01、10、11,假设分别为0、1、2、3,而每一天的状态都由前一天来决定,所以我们可以定义另一个数组来表示当天的状态。
- 对每天不同的状态进行模拟,假设今天的状态是1,那么就要分析前一天的状态,若前一天是1,那么今天就不能完成1状态的任务,这时今天就相当于是0状态,以此类推······总之就是根据前一天发生的事来确定今天发生的事
数据处理
- 要统计最少的娱乐天数,即统计最多的学习天数。
- 需要对第一天的情况单独讨论。
- 前面所说根据前一天的情况来确定今天的状态,那么如果今天原本的状态无法满足,就需要对数据进行处理,将其变成当天所表现出来的状态,例如,昨天是1,今天也是1,说明今天只能娱乐,那么就需将1变为0。同样的,如果昨天是2,今天是3,要求最大学习天数,那么今天就要变成1状态。
代码实现
#include<stdio.h>
int main(){
int a[100000],b[100000],n,sum=0,i,c[100000];
//定义数组c[100000],用来表示每天的状态
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++ ){
if( !a[i]&&!b[i] ) c[i]=0;
if( !a[i]&&b[i] ) c[i]=1;
if( a[i]&&!b[i] ) c[i]=2;
if( a[i]&&b[i] ) c[i]=3;
}
if( c[0]!=0 ) sum++;
for( i=1; i<n; i++){
if( c[i]==1||c[i]==2 ) {
if( c[i]==c[i-1] ) {
c[i]=0;
}
else sum++;
}
if( c[i]==3) {
sum++;
c[i]=3-c[i-1];
}
}
printf("%d",n-sum);
return 0;
}
写在最后
计算机小白的第一篇博客,啥也不会 .0_0. ,还望大佬们多多指教 .-_-.