lsmCC 发表于 2023-11-19 16:38:30

修改代码,为什么没有输出呢

#include <bits/stdc++.h>
using namespace std;
const int N=1e5;
int a,b;
typedef long long ll;
vector<ll>c;
ll ans=0;

int main()
{
    int n,m;
    ll x,y;
    cin>>n>>m;
    c.resize(n+m);
    for(int i=1;i<=n;i++)
    {
      cin>>x;
      a=x;
      c.push_back(x);
      
    }
    for(int j=1;j<=m;j++)
    {
      cin>>y;
      b=y;
      c.push_back(y);
    }
    sort(c.begin(),c.end());
    for(int i=1;i<=n;i++)
    {
         ans =a;
      //    cout<<ans<<endl;
          int l=1,r=c.size();
          while(l<r)
          {
                ll mid=l+r/2;
                if(c>=ans) r=mid;
                else l=mid+1;
          }
          cout<<l<<endl;
         
         
    }
    cout<<endl;
    for(int i=1;i<=m;i++)
    {
         ans =b;
      //    cout<<ans<<endl;
          int l=1,r=c.size();
          while(l<r)
          {
                ll mid=l+r/2;
                if(c>=ans) r=mid;
                else l=mid+1;
          }
          cout<<l<<endl;
         
         
    }
   


   
   
}

isdkz 发表于 2023-11-19 16:38:41

问题出在对c的大小进行了resize操作,然后又使用push_back来添加元素,导致c中前n+m个元素是未初始化的。应该将resize操作修改为c.reserve(n+m)来预留空间,然后使用c[ i]=x和c=y来赋值。此外,二分查找时mid的计算应该为(ll)(l+r)/2,而不是l+r/2。最后,应该在每次循环结束后将l和r初始化为1和c.size(),以便下一次使用。以下是修改后的代码:

#include <bits/stdc++.h>
using namespace std;
const int N=1e5;
int a,b;
typedef long long ll;
vector<ll>c;
ll ans=0;

int main()
{
    int n,m;
    ll x,y;
    cin>>n>>m;
    c.reserve(n+m); // 修改为reserve
    for(int i=0;i<n;i++) // 修改为从0开始
    {
      cin>>x;
      a[ i]=x; // 修改为a[ i]
      c[ i]=x; // 修改为c[ i]
    }
    for(int j=0;j<m;j++) // 修改为从0开始
    {
      cin>>y;
      b=y; // 修改为b
      c=y; // 修改为c
    }
    sort(c.begin(),c.end());
    for(int i=0;i<n;i++) // 修改为从0开始
    {
            ans =a[ i];
            int l=1,r=c.size();
            while(l<r)
            {
                ll mid=(ll)(l+r)/2; // 修改二分查找中mid的计算
                if(c>=ans) r=mid;
                else l=mid+1;
            }
            cout<<l<<endl;
    }
    cout<<endl;
    for(int i=0;i<m;i++) // 修改为从0开始
    {
            ans =b[ i];
            int l=1,r=c.size();
            while(l<r)
            {
                ll mid=(ll)(l+r)/2; // 修改二分查找中mid的计算
                if(c>=ans) r=mid;
                else l=mid+1;
            }
            cout<<l<<endl;
    }
}

Mike_python小 发表于 2023-11-19 16:41:28

修改后的代码如下:

++
#include <iostream>
#include <vector>
#include <algorithm>
typedef long long ll;

int main()
{
    int n, m;
    ll x, y;
    std::cin >> n >> m;

    std::vector<ll> a(n), b(m), c(n + m);
    for (int i = 0; i < n; ++i)
    {
      std::cin >> x;
      a = x;
      c = x;
    }
    for (int i = 0; i < m; ++i)
    {
      std::cin >> y;
      b = y;
      c = y;
    }

    std::sort(c.begin(), c.end());

    for (int i = 0; i < n; ++i)
    {
      ll ans = a;
      int l = 0, r = c.size() - 1;
      while (l < r)
      {
            int mid = l + (r - l) / 2;
            if (c >= ans)
                r = mid;
            else
                l = mid + 1;
      }
      std::cout << l + 1 << std::endl;
    }

    std::cout << std::endl;

    for (int i = 0; i < m; ++i)
    {
      ll ans = b;
      int l = 0, r = c.size() - 1;
      while (l < r)
      {
            int mid = l + (r - l) / 2;
            if (c >= ans)
                r = mid;
            else
                l = mid + 1;
      }
      std::cout << l + 1 << std::endl;
    }

    return 0;
}


主要的修改包括:

1. 将 vector 的大小定义为 n + m,避免不必要的调整大小操作。
2. 在输入数据时,将元素存入向量 a 和 b 中,并且将它们的值同时放入向量 c 中。
3. 使用 std::sort 函数来对向量 c 进行排序。
4. 对于每个元素 a 和 b,使用二分查找在有序向量 c 中找到其插入位置,并输出位置信息。
5. 修改了一些变量的初始值和循环索引,使得程序逻辑更加清晰。

希望以上修改对你有所帮助,如果还有其他问题,请随时向我提问。
页: [1]
查看完整版本: 修改代码,为什么没有输出呢