我在问题解决方案http://www.codechef.com/problems/MCHEF中遇到问题,这是我的解决方案http://ideone.com/SsbABr
我用背包和套装解决了这个问题,但我得到了错误的答案,似乎无法弄明白为什么!我也看过同样的社论也是如此。我相信我的背包DP代码是正确的。
问题似乎在下面的段中使用set来插入和维护间隔成本,这样我就可以获得每个元素的最低成本。
vector<int> L[n],R[n];
vector<oper> operarray;
vector<int> cost;
for(int i=0;i<m;i++){
int j,k,val;
cin >> j >> k >> val;
L[j-1].push_back(i);
R[k-1].push_back(i);
cost.push_back(val);
}
set<pair<int,int> > iset;
for(int i=0;i<n;i++){
for(int j=0;j<L[i].size();j++){
int index = L[i][j];
iset.insert(make_pair(cost[index],index));
}
b[i] = iset.begin()->first;
for(int j=0;j<R[i].size();j++){
int index = R[i][j];
iset.erase(make_pair(cost[index],index));
}
答案 0 :(得分:0)
实际上问题是我没有检查该集是否为空,并且当我将空集的begin元素分配给行中的数组元素时,编译器没有提示任何运行时错误
b[i] = iset.begin()->first;
以上内容应改为
if(!iset.empty())
b[i] = iset.begin()->first;