分治基本算法
//n个数m个询问小于等于x的数 #include<iostream> #include<cstdio> using namespace std; int a[100]; int n,m; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); a[0]=-1; for(int i=1;i<=m;i++) { int x,left=1,right=n,mid; scanf("%d",&x); while(left<=right) { mid=(left+right)/2; if(a[mid]<=x)left=mid+1; else right=mid-1; } printf("%d\n",a[right]); } return 0; }
//快排 #include<iostream> #include<cstdio> using namespace std; int n,a[100]; void qsort(int l,int r) { int i=l,j=r,mid=a[(l+r)/2]; while(i<=j) { while(a[i]<mid)i++; while(a[j]>mid)j--; if(i<=j)swap(a[i],a[j]),i++,j--; } if(l<j)qsort(l,j); if(r>i)qsort(i,r); } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); qsort(1,n); for(int i=1;i<=n;i++) printf("%d ",a[i]); return 0; }
//归并排序求逆序对 #include<iostream> #include<cstdio> using namespace std; int n,tot,a[100],temp[100]; void merge_sort(int left,int right) { if(left==right)return; int mid=(left+right)/2; merge_sort(left,mid); merge_sort(mid+1,right); int p=left,i=left,j=mid+1; while(i<=mid&&j<=right) { if(a[i]>a[j]) { tot=tot+mid-i+1;temp[p++]=a[j++]; } else temp[p++]=a[i++]; } while(i<=mid)temp[p++]=a[i++]; while(j<=right)temp[p++]=a[j++]; for(int i=left;i<=right;i++)a[i]=temp[i]; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); merge_sort(1,n); cout<<tot<<endl; for(int i=1;i<=n;i++) printf("%d ",a[i]); return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 9 new features-C#13新的锁类型和语义
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· 不到万不得已,千万不要去外包
· C# WebAPI 插件热插拔(持续更新中)
· .NET 9 new features-C#13新的锁类型和语义
· 会议真的有必要吗?我们产品开发9年了,但从来没开过会
· 《SpringBoot》EasyExcel实现百万数据的导入导出