codeforces 698A

题目链接 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]));
		
		
	}
}

猜你喜欢

转载自blog.csdn.net/qq_25955145/article/details/81259542