我有一排数字,我想把它放进去。放置它的方式是你看桩(它们应该总是按尺寸排序),如果你发现一个桩的数量小于那堆的第一个数,你就放在桩的前面;如果它比桩中的最后一个数字大,那就把它放在桩的后面。如果上述情况都不属实,那么你就可以新建一桩。例如:
输入:
2 5 4 3 4 5 7 6 5 0 // 0 is used for end of input
输出:
3 4 5 7
2 5 6
4 5
程序编译和工作,但不是它应该的方式(不同的结果)。代码如下:
#include <iostream>
#include <deque>
#include <vector>
using namespace std;
void sort_by_size( vector<deque<int>>& container )
{
for(int i=0;i<container.size();i++ )
for(int j=i;j<container.size();j++)
if(container.at(i).size()<container.at(j).size())
swap(container.at(i),container.at(j));
}
int main()
{
int n;
vector<int> all_dishes;
while(n!=0)
{
cin>>n;
if(n!=0)
all_dishes.push_back(n);
}
vector<deque<int>> piles ;
for(int i=0;i<all_dishes.size();i++)
{
sort_by_size(piles);
bool smaller = false;
bool greater = false;
for(int j=0;j<piles.size();j++)
{
if(all_dishes.at(i)<*piles.at(j).begin())
{
piles.at(j).push_front(all_dishes.at(i));
smaller = true;
break;
}
if(all_dishes.at(i)>*piles.at(j).end())
{
piles.at(j).push_back(all_dishes.at(i));
greater = true;
break;
}
}
if ( smaller==false && greater==false )
{
deque<int> temp;
temp.push_back(all_dishes.at(i));
piles.push_back(temp);
}
/*cout<<i<<":"<<endl;
for(int i=0;i<piles.size();i++)
{
for(int j=0;j<piles.at(i).size();j++)
{
cout<<piles.at(i).at(j)<<" ";
}
cout<<endl;
}*/ //for looking what happens at each iteration
}
for(int i =0;i<piles.size();i++)
{
for(int j=0;j<piles.at(i).size();j++)
{
cout<<piles.at(i).at(j)<<" ";
}
cout<<endl;
}
return 0;
}
任何想法算法的问题是什么以及如何修复它?
答案 0 :(得分:1)
你有几个问题。
首先,您的n
变量未初始化。这应该会触发编译器错误。
其次,您尝试从end()
迭代器中取消引用该元素。这是不可能的,因为它指向序列末尾的那个,因此end()
不可解除。您应该使用back()
。
换句话说,这个
if(all_dishes.at(i)>*piles.at(j).end())
应该成为这个:
if(all_dishes.at(i) > piles.at(j).back())
通过这些更改,您的程序将输出预期结果。