C++ 无限循环c++;带while和向量对

C++ 无限循环c++;带while和向量对,c++,C++,当我尝试输入时,这个程序给出无穷循环 1. 3 7 1 2 2 3 3 1 我手动运行它,在我看来它是有效的,我不明白为什么while会给出无限循环(至少在这种情况下是输入) #包括 #包括 #包括 使用名称空间std; int main() { 无符号长T,N,M,p,M; 向量v; cin>>T; 对于(无符号长i=0;i>N>>M; for(无符号长j=0;j>p>>m; v、 推回({p,m}); } 排序(v.begin(),v.end()); 而(M>=v[0]。秒) { while

当我尝试输入时,这个程序给出无穷循环 1. 3 7 1 2 2 3 3 1 我手动运行它,在我看来它是有效的,我不明白为什么while会给出无限循环(至少在这种情况下是输入)

#包括
#包括
#包括
使用名称空间std;
int main()
{
无符号长T,N,M,p,M;
向量v;
cin>>T;
对于(无符号长i=0;i>N>>M;
for(无符号长j=0;j>p>>m;
v、 推回({p,m});
}
排序(v.begin(),v.end());
而(M>=v[0]。秒)
{

while(v[0]。首先不通过调试器跟踪问题的一种方法是在重要行中写入关键数据的值

另外,由于您知道您有一个无限循环,请添加代码以限制循环执行的次数

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

//ADDED: Function to print the contents of the vector.
void print(vector <pair<unsigned long long, unsigned long long > > const& v)
{
   for (auto const& p : v )
   {
      cout << p.first << " " << p.second << " ";
   }
   cout << endl;
}

int main()
{
   unsigned long long T,N , M ,p , m ;
   vector <pair<unsigned long long, unsigned long long > > v;
   cin>>T ;
   for  (unsigned long long i=0 ; i<T;i++)
   {
      v={};
      cin>>N>>M ;
      for (unsigned long long j=0 ; j< N ; j++)
      {
         cin>>p>>m ;
         v.push_back({p,m});
      }
      sort(v.begin(),v.end());

      //ADDED: Limit the number iterations of the loop.
      int count = 0;
      while (M>=v[0].second && count < 20)
      {
         //ADDED: Print the key pieces that control the loop.
         cout << "M: " << M << " v[0].second: " << v[0].second << endl;

         while (v[0].first<=v[1].first)
         {
            v[0].first+=1 ;
            M-=v[0].second;

         }
         sort(v.begin(),v.end());

         //ADDED: Print the vector
         print(v);
         ++count;
      }
   }
   cout<<"ans"<<v[0].first ;
}
如您所见,M的值变得非常大。当
(M-
v[0]。秒)
为负值


您可以通过将
M
设置为签名类型来修复它。从您的帖子中很难判断这是否是适合您的解决方案。我相信您将能够以这种或那种方式解决此问题。

为什么不调试它呢?删除
未签名的
,并观看一切神奇的工作:-)这是因为您正在使
M
超过0您是对的,当我删除“unsigned”时,它提供了适当的解决方案,但我不明白为什么(M-v[0]。秒)重要的是,我的意思是M仍然>=0,第三个输出应该是M=0!因此它将0与1进行比较,然后exits@user6465283,这时单步执行调试器可能会很有用。嗯,当我调试时,它只显示M接受18446744073709551613而不是0,我问的是为什么它接受这样的值,因为未签名的可以接受0。添加一行以打印
M
v[0]。第二个
就在第
M-=v[0]行之前。第二个;
。这会很有帮助。
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

//ADDED: Function to print the contents of the vector.
void print(vector <pair<unsigned long long, unsigned long long > > const& v)
{
   for (auto const& p : v )
   {
      cout << p.first << " " << p.second << " ";
   }
   cout << endl;
}

int main()
{
   unsigned long long T,N , M ,p , m ;
   vector <pair<unsigned long long, unsigned long long > > v;
   cin>>T ;
   for  (unsigned long long i=0 ; i<T;i++)
   {
      v={};
      cin>>N>>M ;
      for (unsigned long long j=0 ; j< N ; j++)
      {
         cin>>p>>m ;
         v.push_back({p,m});
      }
      sort(v.begin(),v.end());

      //ADDED: Limit the number iterations of the loop.
      int count = 0;
      while (M>=v[0].second && count < 20)
      {
         //ADDED: Print the key pieces that control the loop.
         cout << "M: " << M << " v[0].second: " << v[0].second << endl;

         while (v[0].first<=v[1].first)
         {
            v[0].first+=1 ;
            M-=v[0].second;

         }
         sort(v.begin(),v.end());

         //ADDED: Print the vector
         print(v);
         ++count;
      }
   }
   cout<<"ans"<<v[0].first ;
}