其他分享
首页 > 其他分享> > 2021.02.20个人赛

2021.02.20个人赛

作者:互联网

C题:https://codeforces.com/problemset/problem/699/C

题目大意:

该题就是一个人每天有四种情况,休息,比赛,运动,比赛或运动;其中不能连续进行比赛和运动,给出n天可选择的情况,问最小的休息天数。

思路:

该题其实便可想到,本天的情况,可由上一天的基础是来考虑,所以便可使用DP,来进行求解,比赛或运动这种情况,可以通过分成两块来进行考虑。

解题代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <queue>
using namespace std;
const long long N = 1e10 + 7;
const int maxn = 2e7 + 5;
const long long INF = 8e18;
typedef long long ll;
#define for0(i,n) for(int i = 0;i < n;i++)
#define for1(i,n) for(int i = 1;i <= n;i++)
int dp[110][4];
int v[110];
int main()
{
    //0 休息  1 比赛  2 运动 3 运动和比赛
    int n;
    cin >> n;
    for(int i = 0;i <= n;i++){
        for(int j = 0;j <= 3;j++){
            dp[i][j] = maxn;
        }
    }
    dp[0][0] = 0;
    for(int i = 1;i <= n;i++){
        cin >> v[i];
    }
    int minnum = maxn;
    for(int i = 1;i <= n;i++){
        dp[i][0] = min(dp[i-1][0],dp[i-1][1]);
        dp[i][0] = min(dp[i][0],dp[i-1][2]);
        dp[i][0]++;


        if(v[i] == 1){
            dp[i][1] = min(dp[i-1][0],dp[i-1][2]);

        }
        if(v[i] == 2){
            dp[i][2] = min(dp[i-1][0],dp[i-1][1]);

        }
        if(v[i] == 3){
            dp[i][1] = min(dp[i-1][0],dp[i-1][2]);
            dp[i][2] = min(dp[i-1][0],dp[i-1][1]);
        }

    }
    minnum = min(minnum,dp[n][0]);
    minnum = min(minnum,dp[n][1]);
    minnum = min(minnum,dp[n][2]);

    cout << minnum << endl;

}

 

标签:2021.02,20,比赛,int,long,个人赛,maxn,const,include
来源: https://www.cnblogs.com/emhhbw/p/14441936.html