腾讯刷题 假期

由于业绩优秀,公司给小Q放了 n 天的假,身为工作狂的小Q打算在在假期中工作、锻炼或者休息。他有个奇怪的习惯:不会连续两天工作或锻炼。只有当公司营业时,小Q才能去工作,只有当健身房营业时,小Q才能去健身,小Q一天只能干一件事。给出假期中公司,健身房的营业情况,求小Q最少需要休息几天。

输入描述:
第一行一个整数 表示放假天数
第二行 n 个数 每个数为0或1,第 i 个数表示公司在第 i 天是否营业
第三行 n 个数 每个数为0或1,第 i 个数表示健身房在第 i 天是否营业
(1为营业 0为不营业)

输出描述:
一个整数,表示小Q休息的最少天数

输入例子1:

4
1 1 0 0
0 1 1 0

输出例子1:

2

例子说明1: 小Q可以在第一天工作,第二天或第三天健身,小Q最少休息2天

通过题意,我们了解到,当小Q在当天工作时,前一天一定是在锻炼或者休息;当小Q当天锻炼时,前一天一定是在工作或者休息,于是可以用动态规划来完成,首先使用一个二维数组来存放前几天最多工作或者锻炼的天数,一次来不断累加,最后求出小Q最多不休息的天数,减去即可得到最少休息天数。

#include <iostream>
#include <stdio.h>
#include <bits/stdc++.h>

using namespace std;

#define INF 0x3f3f3f3f

int work[100001], sport[100001], dp[100001][2];

int main()
{
    int n, i;
    scanf("%d", &n);
    for(i = 1;i <= n;i++)
    {
        scanf("%d", &work[i]);
    }
    for(i = 1;i <= n;i++)
    {
        scanf("%d", &sport[i]);
    }
    for(i = 1;i <= n;i++)
    {
        dp[i][0] = max(dp[i-1][1]+work[i], dp[i-1][0]);
        dp[i][1] = max(dp[i-1][0]+sport[i], dp[i-1][1]);
    }
    printf("%d\n", n-max(dp[n][0], dp[n][1]));
    return 0;
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值