The problem指出,我们必须找到要删除的最小学生人数,以便第i个学生可以通过考试。因此,我基本上是在一个多集中添加学生,因为它存储排序后的值,而排序后的总和大于所需的分数时,我们将其减去并移至下一个。
问题来自输入:
3 4 3 9 1 1 9 8 9
带有m:要通过的必需标记为14
在这里以某种方式删除了输入的第6个索引9,该索引尚未添加到多集。
运行有问题的输入时得到的输出:
0 0 0 ;4--;3-- 2 ;9-- 1 ;9-- 1 ;9--;4--;9-- 3 ;9--;9--;9-- 3 ;9--;9--;9--;9-- 4
:“”中的值包含* x,该值从总和中减去后有9,但是我不知道怎么办?
multiset<int> st;
int setsum =0;
for(int i=0;i<n;i++)
{
int sum = setsum+ar[i];
if((sum)<=m)
{
cout<<"0 ";
}
else
{
//cout<<sum<<"-*";
int cnt = 0;
auto x = st.rbegin();
while(sum>m)
{
sum -= *x;
//cout<<";"<<*x<<"--";
x--;
//if(i==3)
//cout<<*x<<"++";
cnt++;
}
cout<<" "<<cnt<<" ";
}
st.emplace(ar[i]);
setsum += ar[i];
}
答案 0 :(得分:1)
可能不是唯一的问题,但我不禁注意到在使用反向迭代器时的两个主要错误:
--x
)而不是递增(++x
);反向迭代器的全部要点是方向是反向的,因此您应该增加迭代器以向后移动st
。您使用--x
的唯一原因是,如果您有双向迭代器,并且想与“自然”迭代顺序相反(因此,正向迭代器将向后运行,而反向迭代器将向后运行)。st
的结尾;如果您在st
之前从sum > m
的末尾开始(我们没有m
的定义,因此无法在结束st
之前确定此条件是否成立{1}}),您遇到未定义的行为。最简单的解决方法是简单地将测试更新为while (sum > m && x != st.rend())
,尽管稍后可能会影响您的代码逻辑(因为现在退出循环并不能保证sum
小于或等于{{ 1}}),需要进行进一步的测试。