首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一个简单Oympiad问题的贪心算法

一个简单Oympiad问题的贪心算法
EN

Stack Overflow用户
提问于 2021-06-16 20:26:54
回答 1查看 58关注 0票数 0

我是一个编程的初学者,正在尝试解决澳大利亚信息学奥林匹克竞赛的问题。

我被这个问题卡住了,尽管对我来说它看起来非常简单和直接。下面是这个问题的链接:

AIO 2020 - Baubles

下面是我的代码片段,它只获得了15%的分数:

代码语言:javascript
运行
复制
void solve(){
ll r,b,s,nr,nb;
cin >> r >> b >> s >> nr >> nb;
ll ans = 0;
if (s + r < nr || s + b < nb) ans = 0;
else {
    ll diff_b, diff_r;
    vector<ll>sum;
    
    diff_r = nr - r -1;
    sum.push_back(s - diff_r);
    diff_b = nb - b - 1;
    sum.push_back(s - diff_b);
    sum.push_back(s - diff_b - diff_r - 1);
    ll min = INFINITY;
    for (int i = 0 ; i < sum.size(); i++) if (sum[i] < min) min = sum[i];
    ans = min;
}
cout << ans;}

在这里,我考虑减少spare和初始的红/蓝,如果它们分别大于所需的红/蓝,则减少后的红/蓝+ spare将等于所需的红/蓝- 1。

请帮助我了解我做错了什么,并了解解决这个问题的好方法!

EN

回答 1

Stack Overflow用户

发布于 2021-06-16 21:01:25

您需要在if语句中再添加一个条件:

代码语言:javascript
运行
复制
if (s + r < nr || s + b < nb || s + r + b < nr + np) ans = 0;

这也会影响到你的第三次推送(s - diff_b - diff_r - 1),因为它可能会变成负数。休息对我来说似乎很好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68002654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档