修改代码,为什么没有输出呢
#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;
}
} 问题出在对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;
}
}
修改后的代码如下:
++
#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]