鱼C论坛

 找回密码
 立即注册
查看: 562|回复: 2

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

[复制链接]
发表于 2023-11-19 16:38:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <bits/stdc++.h>
using namespace std;
const int N=1e5;
int a[N],b[N];
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[i]=x;
        c.push_back(x);
        
    }
    for(int j=1;j<=m;j++)
    {
        cin>>y;
        b[j]=y;
        c.push_back(y);
    }
    sort(c.begin(),c.end());
    for(int i=1;i<=n;i++)
    {
           ans =a[i];
        //    cout<<ans<<endl;
          int l=1,r=c.size();
          while(l<r)
          {
                ll mid=l+r/2;
                if(c[mid]>=ans) r=mid;
                else l=mid+1;
          }
          cout<<l<<endl;
         
         
    }
    cout<<endl;
    for(int i=1;i<=m;i++)
    {
           ans =b[i];
        //    cout<<ans<<endl;
          int l=1,r=c.size();
          while(l<r)
          {
                ll mid=l+r/2;
                if(c[mid]>=ans) r=mid;
                else l=mid+1;
          }
          cout<<l<<endl;
         
         
    }
   


   
   
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N=1e5;
  4. int a[N],b[N];
  5. typedef long long ll;
  6. vector<ll>c;
  7. ll ans=0;

  8. int main()
  9. {
  10.     int n,m;
  11.     ll x,y;
  12.     cin>>n>>m;
  13.     c.reserve(n+m); // 修改为reserve
  14.     for(int i=0;i<n;i++) // 修改为从0开始
  15.     {
  16.         cin>>x;
  17.         a[ i]=x; // 修改为a[ i]
  18.         c[ i]=x; // 修改为c[ i]
  19.     }
  20.     for(int j=0;j<m;j++) // 修改为从0开始
  21.     {
  22.         cin>>y;
  23.         b[j]=y; // 修改为b[j]
  24.         c[n+j]=y; // 修改为c[n+j]
  25.     }
  26.     sort(c.begin(),c.end());
  27.     for(int i=0;i<n;i++) // 修改为从0开始
  28.     {
  29.             ans =a[ i];
  30.             int l=1,r=c.size();
  31.             while(l<r)
  32.             {
  33.                 ll mid=(ll)(l+r)/2; // 修改二分查找中mid的计算
  34.                 if(c[mid]>=ans) r=mid;
  35.                 else l=mid+1;
  36.             }
  37.             cout<<l<<endl;
  38.     }
  39.     cout<<endl;
  40.     for(int i=0;i<m;i++) // 修改为从0开始
  41.     {
  42.             ans =b[ i];
  43.             int l=1,r=c.size();
  44.             while(l<r)
  45.             {
  46.                 ll mid=(ll)(l+r)/2; // 修改二分查找中mid的计算
  47.                 if(c[mid]>=ans) r=mid;
  48.                 else l=mid+1;
  49.             }
  50.             cout<<l<<endl;
  51.     }
  52. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-19 16:41:28 | 显示全部楼层
修改后的代码如下:
  1. ++
  2. #include <iostream>
  3. #include <vector>
  4. #include <algorithm>
  5. typedef long long ll;
  6. int main()
  7. {
  8.     int n, m;
  9.     ll x, y;
  10.     std::cin >> n >> m;
  11.     std::vector<ll> a(n), b(m), c(n + m);
  12.     for (int i = 0; i < n; ++i)
  13.     {
  14.         std::cin >> x;
  15.         a[i] = x;
  16.         c[i] = x;
  17.     }
  18.     for (int i = 0; i < m; ++i)
  19.     {
  20.         std::cin >> y;
  21.         b[i] = y;
  22.         c[n + i] = y;
  23.     }
  24.     std::sort(c.begin(), c.end());
  25.     for (int i = 0; i < n; ++i)
  26.     {
  27.         ll ans = a[i];
  28.         int l = 0, r = c.size() - 1;
  29.         while (l < r)
  30.         {
  31.             int mid = l + (r - l) / 2;
  32.             if (c[mid] >= ans)
  33.                 r = mid;
  34.             else
  35.                 l = mid + 1;
  36.         }
  37.         std::cout << l + 1 << std::endl;
  38.     }
  39.     std::cout << std::endl;
  40.     for (int i = 0; i < m; ++i)
  41.     {
  42.         ll ans = b[i];
  43.         int l = 0, r = c.size() - 1;
  44.         while (l < r)
  45.         {
  46.             int mid = l + (r - l) / 2;
  47.             if (c[mid] >= ans)
  48.                 r = mid;
  49.             else
  50.                 l = mid + 1;
  51.         }
  52.         std::cout << l + 1 << std::endl;
  53.     }
  54.     return 0;
  55. }
复制代码

主要的修改包括:

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

希望以上修改对你有所帮助,如果还有其他问题,请随时向我提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-22 02:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表