您的位置:首页 > 其它

2016广东工业大学新生杯决赛:Problem D: 勤奋的涟漪2

2016-12-09 00:32 169 查看


Problem D: 勤奋的涟漪2


Description

涟漪进入集训队后,他会去实验室训练或者去操场锻炼。 接下来n天,每天的情况是一下4种中的一种: 1.当天体育馆关门了和没有训练赛 2.当天体育馆关门了和有训练赛 3.当天体育馆开放和没有训练赛 4.当天体育馆开放和有训练赛 涟漪知道之后n天的情况。 涟漪每一天可以休息,或者打训练赛(当天有训练赛)或者运动(当天体育馆开放)。 涟漪要制定一个训练计划,决定每天干什么,但是涟漪不会连续两天都运动或者连续两天都打训练赛, 请帮涟漪找出她最少休息的天数(她不打训练赛和运动)。 休息的时候,她会做下面的数学题






Input

第一行一个整数t(t<=100),代表测试数据, 第二行一个整数 n(1<=n<=100) 第三行有n个数a1,a2,a3,....an(0<=ai<=3)) ai=0 ,代表第一种情况 ai=1,代表第二种情况 ai=2 ,代表第三种情况 ai=3 ,代表第四种情况


Output

输出 一个数 表示(涟漪休息的天数) 乘以(数学题的答案的积)。


Sample Input

4

7

1 3 3 2 1 2 3

1

1

1

2

1

3


Sample Output

0

0

0

0

思路:

贪心算出最少要休息的天数, 并记录就可以了, flag是记录前一天的状态的, 如果flag和此时状态相同也都不为3, 或者此时状态为0, 那么记录就可以了, 一定要注意每次记录完flag一定要归零。(记录状态用到了异或, 恰好1 ^ 2 = 3, 也可以用标记法, 把产生冲突的那天直接在数组里改成0)

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cctype>
#include<cstdio>
#include<set>
#include<cmath>
#include<string>
using namespace std;

int main(){
int t, n;
int a[111];
scanf("%d", &t);
while(t--){
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", a + i);
int cnt = 0, flag = 0;
for(int i = 0; i < n; i++){
if(!a[i]){
cnt++;
flag = 0;
}
else{
if(a[i] == 3)
flag ^= a[i];
else{
if(a[i] == flag){
cnt++;
flag = 0;
}
else
flag = a[i];
}
}
}
cout<<cnt * (-24)<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: