如何解决一个简单的 Oympiad 问题的贪心算法
我是编程初学者,正在尝试解决澳大利亚信息学奥林匹克竞赛中的问题。
我被这个问题困住了,尽管对我来说它看起来非常简单和直接。 这是问题的链接:
下面是我只得了 15% 的代码片段:
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。
请帮助我了解我做错了什么并了解解决此问题的好方法!
解决方法
你需要在if语句中再添加一个条件:
if (s + r < nr || s + b < nb || s + r + b < nr + np) ans = 0;
这也影响了您的第 3 次推送 (s - diff_b - diff_r - 1),因为它可能会变成负数。 休息对我来说很好。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。