题解 CF436A【Feed with Candy】

\(Top\)

原来的翻译有误,不知道现在改了没有。

概述

题号 难度 \(AC\)时间及记录
\(\texttt{CF436A}\) \(\texttt{洛谷难度:暂无评定}\) \(\texttt{On 2021/03/19}\)

解析

这是一道简单题。

题意不难理解。

我们按照题目大意模拟即可。

但是,原来的翻译有误,不知道现在改了没有。

我们考虑分类讨论:

  • 第一次吃水果糖。
  • 第一次吃焦糖。

然后我们考虑每次选吃哪一个:

  • 跳的高度够得到。
  • 和上一颗糖不一样。
  • 没被吃过。
  • 质量最大。

于是代码就不难写出了。

代码

#include<bits/stdc++.h>
using namespace std;
struct Struct
{
    int Opt;
    int Height;
    int Delta;
    bool Eaten;
    inline bool operator < (const Struct &Compare)const
    {
        if(Height!=Compare.Height)return Height<Compare.Height;
        else return Delta>Compare.Delta;
    }
};
int Total,Highd,High;
Struct Candy[2001];
int main(void)
{
    register int i;
    cin>>Total>>Highd;
    High=Highd;
    for(i=1;i<=Total;i++)cin>>Candy[i].Opt>>Candy[i].Height>>Candy[i].Delta;
    sort(Candy+1,Candy+Total+1);
    register int Last;
    register int Count1;
    Count1=0;
    Last=1;
    for(i=1;i<=Total;i++)Candy[i].Eaten=false;
    while(true)
    {
        register int Mx,W;
        Mx=W=0;
        for(i=1;i<=Total;i++)if(High>=Candy[i].Height&&(!Candy[i].Eaten)&&Last!=Candy[i].Opt)if(Candy[i].Delta>Mx)
        {
            Mx=Candy[i].Delta;
            W=i;
        }
        if(!W)break;
        else Count1++,Candy[W].Eaten=true,High+=Candy[W].Delta;
        Last=1-Last;
    }
    register int Count2;
    Count2=0;
    Last=0;
    High=Highd;
    for(i=1;i<=Total;i++)Candy[i].Eaten=false;
    while(true)
    {
        register int Mx,W;
        Mx=W=0;
        for(i=1;i<=Total;i++)if(High>=Candy[i].Height&&(!Candy[i].Eaten)&&Last!=Candy[i].Opt)if(Candy[i].Delta>Mx)
        {
            Mx=Candy[i].Delta;
            W=i;
        }
        if(!W)break;
        else Count2++,Candy[W].Eaten=true,High+=Candy[W].Delta;
        Last=1-Last;
    }
    cout<<max(Count1,Count2)<<endl;
    return 0;
}
posted @ 2021-03-24 20:22  Bushuai_Tang  阅读(94)  评论(0)    收藏  举报