我的代码出了什么问题。我在提交时遇到分段错误。
#include <iostream>
#include <set>
#include <algorithm>
using namespace std;
int main() {
int t;
cin>>t;
while(t--){
int n,k;
cin>>n>>k;
int x;
set<int> s;
for(int i=0;i<n;i++){
cin>>x;
s.insert(x);
}
int m;
int ans=0;
for(int i=0;i<k;i++){
m=*s.rbegin();
ans+=m;
s.insert(m/2);
s.erase(m);
}
cout<<ans<<"\n";
}
return 0;
}
问题的限制因素是:
1≤T≤10
1≤N≤10^ 5
0≤K≤10^ 5
0≤Si≤10^ 5
答案 0 :(得分:1)
使用n=1
,k=2
,x=0
,您将0
插入集合中,然后再次插入0
(不执行任何操作),然后移除{ {1}}来自集合。在下一轮0
轮次中,您将尝试阅读空集的k
,从而导致崩溃。
答案 1 :(得分:0)
如果删除最后一个元素,则容器为空。
然后尝试取消引用迭代器会导致未定义的行为(可能是程序崩溃)。
我建议您检查是否有任何(至少一个)元素,如果没有,则打破循环。
实施例
for(int i=0;i<k && s.size()!=0 ;i++){
答案 2 :(得分:0)
在访问要设置的元素之前,请检查您的设置是否为空。
if(!s.empty()){
m=*s.rbegin();
ans+=m;
s.insert(m/2);
s.erase(m);
}