我是一个编程的初学者,正在尝试解决澳大利亚信息学奥林匹克竞赛的问题。
我被这个问题卡住了,尽管对我来说它看起来非常简单和直接。下面是这个问题的链接:
下面是我的代码片段,它只获得了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。
请帮助我了解我做错了什么,并了解解决这个问题的好方法!
发布于 2021-06-16 21:01:25
您需要在if语句中再添加一个条件:
if (s + r < nr || s + b < nb || s + r + b < nr + np) ans = 0;
这也会影响到你的第三次推送(s - diff_b - diff_r - 1),因为它可能会变成负数。休息对我来说似乎很好。
https://stackoverflow.com/questions/68002654
复制相似问题