(贪心) Vacations 求休息的最少天数

Description

Vasya has n days of vacations! So he decided to improve his IT skills and do sport. Vasya knows the following information about each of this n days: whether that gym opened and whether a contest was carried out in the Internet on that day. For the i-th day there are four options:

  1. on this day the gym is closed and the contest is not carried out;
  2. on this day the gym is closed and the contest is carried out;
  3. on this day the gym is open and the contest is not carried out;
  4. on this day the gym is open and the contest is carried out.

On each of days Vasya can either have a rest or write the contest (if it is carried out on this day), or do sport (if the gym is open on this day).

Find the minimum number of days on which Vasya will have a rest (it means, he will not do sport and write the contest at the same time). The only limitation that Vasya has — he does not want to do the same activity on two consecutive days: it means, he will not do sport on two consecutive days, and write the contest on two consecutive days.

Input

The first line contains a positive integer n (1 ≤ n ≤ 100) — the number of days of Vasya‘s vacations.

The second line contains the sequence of integers a1, a2, ..., an (0 ≤ ai ≤ 3) separated by space, where:

  • ai equals 0, if on the i-th day of vacations the gym is closed and the contest is not carried out;
  • ai equals 1, if on the i-th day of vacations the gym is closed, but the contest is carried out;
  • ai equals 2, if on the i-th day of vacations the gym is open and the contest is not carried out;
  • ai equals 3, if on the i-th day of vacations the gym is open and the contest is carried out.

Output

Print the minimum possible number of days on which Vasya will have a rest. Remember that Vasya refuses:

  • to do sport on any two consecutive days,
  • to write the contest on any two consecutive days.

Sample Input

Input

41 3 2 0

Output

2

Input

71 3 3 2 1 2 3

Output

0

Input

22 2

Output

1

用k记录每天的状态,b[i]记录从第一天到第i天休息的天数,每一天的状态只与前一天有关,尽量保证能工作就不休息

 1 // 0 健身房关门   没比赛
 2 // 1 健身房关门   有比赛
 3 // 2 健身房开门   没比赛
 4 // 3 健身房开门   有比赛
 5 #include <cstdio>
 6 int n,a[150],k,i,b[150];
 7 int main()
 8 {
 9
10     while(scanf("%d",&n)!=EOF)
11     {
12         b[0]=0;
13         k=0;
14         for(int i=1;i<=n;i++)
15         {
16             scanf("%d",&a[i]);
17         }
18         for(int i = 1 ; i  <= n ; i++)
19         {
20             if(a[i] == 0)
21             {
22                 b[i]=b[i-1]+1;
23                 k=0;
24             }
25             else
26             {
27                 if(a[i] == 3)
28                 {
29                     b[i]=b[i-1];
30                     k=3-k;
31                 }
32                 else
33                 {
34                     if(a[i] == k)
35                     {
36                         b[i]=b[i-1]+1;
37                         k=0;
38                     }
39                     else
40                     {
41                         b[i]=b[i-1];
42                         k=a[i];
43                     }
44                 }
45             }
46         }
47         printf("%d\n",b[n]);
48     }
49 }
时间: 2024-10-08 04:06:45

(贪心) Vacations 求休息的最少天数的相关文章

POJ-1042 Gone Fishing (贪心法求最佳钓鱼方案

Gone Fishing Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 28075   Accepted: 8371 Description John is going on a fishing trip. He has h hours available (1 <= h <= 16), and there are n lakes in the area (2 <= n <= 25) all reachab

求经过路径最少的最短路

题目保证最短路不止一条,求经过路径最少的最短路. 分析:如果数据小的话可以用floyed+Dp求出,在保证最短路的情况下更新路径少的情况即可,dis表示最短路,大盘dp[i,j]表示从i到j的最短路所需最少路径条数:但一旦数据大于300,很有超时危险,下面是一个小技巧:将边权乘以10^8后+1(注意乘以几要视数据大小而定),再用高效的spfa或堆优化的dijkstra来跑. 为什么呢?举个例子:假定边数不超过100000(10的5次方),而边权*10^8后可以说远大于它,那么在更新最短路时+1会

贪心法求树的最小支配集,最小点覆盖,最大独立集

定义: 最小支配集:对于图G = (V, E) 来说,最小支配集指的是从 V 中取尽量少的点组成一个集合, 使得 V 中剩余的点都与取出来的点有边相连.也就是说,设 V' 是图的一个支配集,则对于图中的任意一个顶点 u ,要么属于集合 V', 要么与 V' 中的顶点相邻. 在 V' 中除去任何元素后 V' 不再是支配集, 则支配集 V' 是极小支配集.称G 的所有支配集中顶点个数最少的支配集为最小支配集,最小支配集中的顶点个数称为支配数. 最小点覆盖:对于图G = (V, E) 来说,最小点覆盖

UVALive 6911 Double Swords (Set,贪心,求区间交集)

首先左边的是必须要选的,然后右边的需要注意,有些区间是可以舍掉的.1.区间里有两个不同的A. 2.区间里有一个A,而且这个A不是这个区间对应的A. 这个题我一开始错在了第2个判定条件上,我定义的id记录的是最后一个出现位置,不能进行判断,所以干脆在结构体里记录了他对应的A值. 舍掉后留下的区间,可以按照区间左边界排序,然后求交集即可. 总体来说,贪心的思想还是不难的,就是有一些细节需要注意. 代码如下: #include<iostream> #include<cstdio> #in

【贪心专题】HDU 1257 最少拦截系统&amp;&amp;HDU 2111 Saving HDU (选宝贝)

链接:click here~~ 题意: 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹. 怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统. [解题思路]: 直接模拟一边就可以,不知道想简单了还是数据

(贪心+倍增求LCA) hdu 4912

Paths on the tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1097    Accepted Submission(s): 366 Problem Description bobo has a tree, whose vertices are conveniently labeled by 1,2,…,n. T

区间dp 求杀怪最少损伤

游戏人生 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 一入宿舍深似海,自此AC是路人,善哉善哉... 有这样一个游戏:有一排妖怪,每个妖怪都有一个主要攻击值和辅助攻击值,你每次只能攻击一个妖怪,当你攻击一个妖怪时,这只妖怪 很显然的就挂了(要不都没得玩儿了),当然当前妖怪对你造成的伤害为  当前妖怪的主要攻击值+旁边两只妖怪的辅助攻击值(如果你攻击的妖怪两边没有妖怪,那辅助攻击就为0). 然后问题就来了,杀死全部妖怪你所受的最小伤害值是多少? 输入 第一行一个整

算法笔记——硬币找零之最少硬币数

题目来源:NYOJ995 问题描述: 在现实生活中,我们经常遇到硬币找零的问题,例如,在发工资时,财务人员就需要计算最少的找零硬币数,以便他们能从银行拿回最少的硬币数,并保证能用这些硬币发工资. 我们应该注意到,人民币的硬币系统是 100,50,20,10,5,2,1,0.5,0.2,0.1,0.05, 0.02,0.01 元,采用这些硬币我们可以对任何一个工资数用贪心算法求出其最少硬币数. 但不幸的是: 我们可能没有这样一种好的硬币系统, 因此用贪心算法不能求出最少的硬币数,甚至有些金钱总数还

Codeforces Round #363 Div.2[11110]

好久没做手生了,不然前四道都是能A的,当然,正常发挥也是菜. A:Launch of Collider 题意:20万个点排在一条直线上,其坐标均为偶数.从某一时刻开始向左或向右运动,速度为每秒1个单位长度.输入给出每个点的坐标及其移动的方向,求发生第一次碰撞的时间,若不会碰撞,则输出-1 最先发生碰撞的是一定是初始时相邻的两个点,因此只需对每个点循环一边,判断其是否会与下一个点碰撞,并求出其时间即可. #include<stdio.h> #include<stdlib.h> int