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
47
1 3 3 2 1 2 3
1
1
1
2
1
3
Sample Output
00
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; } }
相关文章推荐
- 如何实现jsp数据插入sql数据库
- NDK各个版本链接
- 补充 Flying Saucer 不支持中文,换行,粗体,CheckBox多选框如何解决
- CentOS 6.8 LAMP 安装配置
- linux ssh远程登陆报警提醒
- oracle数据库软件安装
- Google Developer Day 2016见闻
- Java Script
- MVC Core 网站开发(Ninesky) 2.1、栏目的前台显示
- PHP碎码——ci的验证码
- [C++]类和对象(二)
- C#实现日志记录 支持按日期多文件保存
- 【Codeforces 237B Young Table】+ map 数组构造
- 模仿与学习MyBatis - 1.6 注解与Session:sql语句
- 全面的Seo面试题
- 《中国当代社会各阶层分析》
- background-position 用法详细介绍
- BZOJ 4726 POI2017 Sabota? 树形DP
- [C++]类和对象(一)
- 镜像劫持2