题目链接 http://codeforces.com/problemset/problem/698/A
题意:
一个人每天可以选择打比赛,也可以选择做运动。但是,他一天不会同时做这两件事。
而且他也不会连续两天做同一件事情。
另外,比赛不是每天都有,运动馆不是每天都开。
但是他知道未来几天内的比赛举办,和运动馆开馆时间。
求他如何安排在以上条件下,让自己最大程度上每天都有事做。
输出他的最小休息天数。
解题思路:
设数组 computer,computer[i]表示在第i天打比赛的情况下,到第i天为止他总共休息了多少天。
同理设数组sport。
对于computer[i]来说,
如果昨天打了比赛,那么今天打比赛就意味着今天休息+1。
如果今天没有比赛,那么今天打比赛就意味着今天休息+1。
如果昨天做了运动,那么computer[i]= sport[i-1]
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
typedef long long LL;
typedef long long ll;
const int maxn = 1e6+6;
const int INF = 0x3f3f3f3f;
char str[maxn];
int a[maxn];
int sport[maxn];
int computer[maxn];
void show(int a[],int n){
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}printf("\n");
}
int main(){
//freopen("C:\\Users\\lenovo\\Desktop\\data.in","r",stdin);
int n;
while(scanf("%d",&n)+1){
memset(sport,0,n);
memset(computer,0,n);
for(int i=0;i<n;i++){
scanf("%d",a+i);
}
computer[0] = 1-(a[0]%2);
sport[0] = 1-(a[0]/2);
for(int i=1;i<n;i++){
if(a[i]==0){
computer[i] = min(computer[i-1]+1,sport[i-1]+1);
sport[i] = min(computer[i-1]+1,sport[i-1]+1);
}else if(a[i]==1){
computer[i] = min(computer[i-1]+1,sport[i-1]);
sport[i] = min(sport[i-1]+1,computer[i-1]+1);
}else if(a[i]==2){
computer[i] = min(computer[i-1]+1,sport[i-1]+1);
sport[i] = min(sport[i-1]+1,computer[i-1]);
}else{
computer[i] = min(computer[i-1]+1,sport[i-1]);
sport[i] = min(sport[i-1]+1,computer[i-1]);
}
}
// show(a,n);
// show(computer,n);
// show(sport,n);
printf("%d\n",min(computer[n-1],sport[n-1]));
}
}