笔试题-假期

假期
由于业绩优秀,公司给小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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值