40pts求助

P1571 眼红的Medusa

已AC,此帖结
by asd890123 @ 2024-04-07 20:56:41


```cpp #include<bits/stdc++.h> using namespace std; int n,m,a[1000000],b[1000000],lt,rt,mid; int main(){ cin>>n>>m; for(int i=0;i<=n-1;i++)cin>>a[i];//读入第一行数据 for(int i=0;i<=m-1;i++)cin>>b[i];//读入第二行数据 sort(b,b+m); /*将第二行数据进行排序,不排第一行数据的原因是因为要按照顺序输出,将b数组(第二行数据)和a(第一行数据)进行比较。这里用的是二分查找,效率更高。*/ for(int i=0;i<=n-1;i++){//遍历 lt=0; rt=m-1;//定义左边界和又边界 while(lt<=rt){//while循环条件为左边界<=有边界 mid=(lt+rt)/2;//进行二分 if(a[i]==b[mid]){//比对 cout<<b[mid]<<" ";//直接上输出 break; } if(a[i]>b[mid])lt=mid+1;//如果查找项<匹配项,将lt向右拉到mid+1 if(a[i]<b[mid])rt=mid-1;//如果查找项>匹配项,将rt向左拉到mid-1 } } return 0;//看到这里,祝你在编程的道路上越走越远 } ```
by zhaolu666 @ 2024-04-07 21:00:01


这运用了二分查找来做这道题,你可以看一下
by zhaolu666 @ 2024-04-07 21:00:45


我才改出来awa ```cpp #include<bits/stdc++.h>//改了一下马蜂,看看就行(主要是实在不习惯sorry) using namespace std; const int MAXN=1e5+5; int n,m,a[MAXN],b[MAXN];//定义尽量放外面,不然有可能初始化随机值(本地还看不出来) //int cmp(const void* a,const void* b){return *((int*)a) - *((int*)b);} int main() { cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=m;i++) cin>>b[i]; // qsort(b,m + 1,sizeof(int),cmp); sort(b+1,b+m+1,less<int>());//说句实话很好奇你的做法样例怎么过的awa for(int i=1;i<=n;i++)//是按a数组为第一优先级 { // 因为是遍历a,所以是在b数组里面找a // 你直接判b里面有没有a就行了 // 还有,数组是整数你直接sort就行了,用不着qsort int k=lower_bound(b+1,b+m+1,a[i])-b; if(b[k]==a[i]) cout<<a[i]<<" ";//如果在b里面找到了a,就输出 } return 0; } ``` @[asd890123](/user/1074084)
by z_z_b_ @ 2024-04-07 21:02:54


|