【问题标题】:greedy algorithm for a simple Oympiad problem简单奥林匹克问题的贪心算法
【发布时间】:2021-09-01 06:32:23
【问题描述】:

我是一名编程初学者,并试图解决澳大利亚信息学奥林匹克竞赛中的问题。

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

AIO 2020 - Baubles

下面是我的代码的 sn-p,只得分 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。

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

【问题讨论】:

  • 请在您的问题中直接包含问题的文本,而不是作为网络链接。 (我什至无法打开你的链接)

标签: c++ algorithm math greedy cp


【解决方案1】:

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

if (s + r < nr || s + b < nb || s + r + b < nr + np) ans = 0;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 2023-04-02
    • 2021-11-23
    • 2012-06-27
    • 2022-12-07
    • 1970-01-01
    • 2019-04-27
    相关资源
    最近更新 更多