CodeForces 699C Vacations (贪心)

题目: 传送门
思路: 不能连续两天干同一件事,从贪心的角度我们每次可以让连续的第二天休息,因为如果选择第二天对后面的选择只有两种可能,影响 (即第三天跟第二天相同) 或者不影响(即第三天跟第二天不相同),如果不影响,我们选择 第一天休息和第二天休息的结果不影响,如果影响,我们当然选择第二天休息更优,综上所述,我们每次都选则第二天休息就可以了.

对于两件事都能干的那天,我们尽量保证这天不休息,我们可先看前一天可不可以确定这一天干什么,再确定last的值(具体看代码)。

int main() {
    int n;
    cin>>n;
    int ans = 0;
    int last = 0; // 前一天的状态 , 0为休息
    for(int i=0;i<n;i++) {
        int a;
        cin>>a;
        if(a == 0) ans++; //如果这天只能休息
        if(a != 3&&a!=0) { //如果这天只能干一件事
            //cout<<a<<' '<<last<<endl;
            if(last != 3&&last == a) { //如果前面 不能干 与 a 不同的事 ,a就休息
                ans ++;
                last = 0 ;
                continue;
            }
        }
        if(a == 3) { // 这天两件事都可以干
            //cout<<last<<endl;
            if(last!=0&&last!=3) { //看前面能不能确定这天要干啥
                last = (3-last);
                continue;
            } 
            else if(last == 3) {
                last = 3;
                continue;
            }
        }
        last = a;
    }
    cout<<ans<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43305984/article/details/89374642
今日推荐