假期
由于业绩优秀,公司给小Q放了 n 天的假,身为工作狂的小Q打算在在假期中工作、锻炼或者休息。他有个奇怪的习惯:不会连续两天工作或锻炼。只有当公司营业时,小Q才能去工作,只有当健身房营业时,小Q才能去健身,小Q一天只能干一件事。给出假期中公司,健身房的营业情况,求小Q最少需要休息几天。
时间限制:C/C++ 2秒,其他语言4秒
空间限制:C/C++ 256M,其他语言512M
输入描述:
第一行一个整数 表示放假天数
第二行 n 个数 每个数为0或1,第 i 个数表示公司在第 i 天是否营业
第三行 n 个数 每个数为0或1,第 i 个数表示健身房在第 i 天是否营业
(1为营业 0为不营业)
输出描述:
一个整数,表示小Q休息的最少天数
示例1
输入例子:
4
1 1 0 0
0 1 1 0
输出例子:
2
例子说明:
小Q可以在第一天工作,第二天或第三天健身,小Q最少休息2天
#include <iostream>
#include <string>
#include <vector>
using namespace std;
enum class Status
{
Work,
Sport,
Sleep
};
vector<int> min_days;
vector<int> min_sport_days;
vector<int> min_sleep_days;
int minDays(int idx, Status status, vector<int>& company,
vector<int>& sport, int days) {
int ret = 0;
for (int i = idx; i < days; i++) {
if (status == Status::Sleep && min_sport_days[i] != -1
&& min_days[i]!= -1 && min_sleep_days[i] != -1) {
int min = min_sport_days[i];
if (min > min_days[i]) {
min = min_days[i];
}
if (min > min_sleep_days[i]) {
min = min_sleep_days[i];
}
return ret + min;
}
if (status == Status::Sport && min_sleep_days[i] != -1 && min_days[i] != -1) {
if (min_sleep_days[i] < min_days[i]) {
return ret + min_sleep_days[i];
}
return ret + min_days[i];
}
if (status == Status::Work && min_sleep_days[i] != -1 && min_sport_days[i] != -1) {
if (min_sleep_days[i] < min_sport_days[i]) {
return ret + min_sleep_days[i];
}
return ret + min_sport_days[i];
}
if (status == Status::Work) {
if (sport[i]) {
int ret1 = minDays(i+1, Status::Sleep, company, sport, days);
int ret2 = minDays(i+1, Status::Sport, company, sport, days);
ret1++;
min_sleep_days[i] = ret1;
min_sport_days[i] = ret2;
if (ret1 < ret2) {
ret += ret1;
}
else {
ret += ret2;
}
break;
}
else {
status = Status::Sleep;
ret++;
}
}
else if (status == Status::Sport) {
if (company[i]) {
int ret1 = minDays(i+1, Status::Sleep, company, sport, days);
int ret2 = minDays(i+1, Status::Work, company, sport, days);
ret1++;
min_sleep_days[i] = ret1;
min_days[i] = ret2;
if (ret1 < ret2) {
ret += ret1;
}
else {
ret += ret2;
}
break;
}
else {
status = Status::Sleep;
ret++;
}
}
else {
if (!sport[i] && !company[i]) {
int ret3 = minDays(i + 1, Status::Sleep, company, sport, days);
ret3++;
min_sleep_days[i] = ret3;
ret += ret3;
break;
}
if (sport[i] && company[i]) {
int ret1 = minDays(i + 1, Status::Work, company, sport, days);
int ret2 = minDays(i + 1, Status::Sport, company, sport, days);
int ret3 = minDays(i + 1, Status::Sleep, company, sport, days);
ret3++;
int min = ret1;
min_days[i] = ret1;
min_sport_days[i] = ret2;
min_sleep_days[i] = ret3;
if (ret1 > ret2) {
min = ret2;
}
if (min > ret3) {
min = ret3;
}
ret += min;
}
else if (sport[i]) {
int ret2 = minDays(i + 1, Status::Sport, company, sport, days);
int ret3 = minDays(i + 1, Status::Sleep, company, sport, days);
ret3++;
min_sport_days[i] = ret2;
min_sleep_days[i] = ret3;
if (ret2 < ret3) {
ret += ret2;
}
else {
ret += ret3;
}
}
else {
int ret1 = minDays(i + 1, Status::Work, company, sport, days);
int ret3 = minDays(i + 1, Status::Sleep, company, sport, days);
ret3++;
min_days[i] = ret1;
min_sleep_days[i] = ret3;
if (ret1 < ret3) {
ret += ret1;
}
else {
ret += ret3;
}
}
break;
}
}
return ret;
}
int getMinDays(vector<int>& company, vector<int>& sport, int days) {
int ret1 = 0;
int ret2 = 0;
int ret3 = 0;
if (!company[0] && !sport[0]) {
ret1 = minDays(1, Status::Sleep, company, sport, days);
ret1++;
return ret1;
}
else if (company[0] && sport[0]) {
ret1 = minDays(1, Status::Sleep, company, sport, days);
ret1++;
ret2 = minDays(1, Status::Work, company, sport, days);
ret3 = minDays(1, Status::Sport, company, sport, days);
int min = ret1;
if (ret1 > ret2) {
min = ret2;
}
if (min > ret3) {
min = ret3;
}
return min;
}
else if (company[0]) {
ret1 = minDays(1, Status::Sleep, company, sport, days);
ret1++;
ret2 = minDays(1, Status::Work, company, sport, days);
if (ret1 < ret2) {
return ret1;
}
return ret2;
}
else {
ret1 = minDays(1, Status::Sleep, company, sport, days);
ret1++;
ret3 = minDays(1, Status::Sport, company, sport, days);
if (ret1 < ret3) {
return ret1;
}
return ret3;
}
}
int main() {
int n;
cin >> n;
vector<int> company(n, 0);
vector<int> sport(n, 0);
for (int i = 0; i < n; i++) {
cin >> company[i];
}
for (int i = 0; i < n; i++) {
cin >> sport[i];
}
for (int i = 0; i < n; i++) {
min_days.push_back(-1);
min_sport_days.push_back(-1);
min_sleep_days.push_back(-1);
}
cout << getMinDays(company, sport, n) << endl;
return 0;
}