题解 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;
}
不要妄图追上西坠的太阳,而是要在黎明前就等着它!
浙公网安备 33010602011771号