
SUSE暑假集训第三次作业
发布日期:2021-05-20 04:56:39
浏览次数:26
分类:精选文章
本文共 2501 字,大约阅读时间需要 8 分钟。
编程题解答
一、快速定位问题
思路就是模拟快速排序的过程,这样每一步都能确定目标数字的位置。快速排序的特点是每一趟分割都能保证左边的数字小于等于右边的数字。所以我们可以通过计算每一趟分割后左边有多少个数字,如果目标数字的位置在左边,则继续搜索左边,否则就继续搜索右边。直到找到单个数字的时候,就可以返回这个数字作为结果。代码如下:
#includeusing namespace std; const int N = 1e5 + 10; int n, k, a[N]; int quick_choose(int *a, int l, int r, int k){ if (l == r) return a[l]; int x = a[l]; int i = l - 1, j = r + 1; while (i < j) { while (++i <= r && a[i] <= x); while (--j >= l && a[j] > x); if (i < j) swap(a[i], a[j]); } int sl = j - l + 1; if (sl >= k) return quick_choose(a, l, j, k); else return quick_choose(a, j+1, r, k - sl); } int main(){ scanf("%d%d", &n, &k); for(int i=1; i<=n; i++) scanf("%d", a+i); printf("%d\n", quick_choose(a, 1, n, k)); return 0; }
二、计算逆序对
思路就是利用归并排序来统计逆序对的数量。归并排序可以分解成小数组排序然后归并。在归并过程中,我们可以统计左半边有多少个元素大于右半边的元素,然后加上这个数量就是逆序对的数量。这个方法的时间复杂度是O(n log n),大大降低了计算量。代码如下:
#includeusing namespace std; typedef long long ll; const int N = 1e5 + 10; int a[N], t[N], n; ll merger_sort(int l, int r){ if (l >= r) return 0; int mid = (l + r) >> 1; int i = l, j = mid + 1, k = 0; ll ans = merger_sort(l, mid) + merger_sort(mid+1, r); while (i <= mid && j <= r) { if (a[i] <= a[j]) { t[k++] = a[i++]; } else { t[k++] = a[j++]; ans += mid - i + 1; } } while (i <= mid) t[k++] = a[i++]; while (j <= r) t[k++] = a[j++]; for(int i=l; i<=r; i++, k++) a[i] = t[k]; return ans; } int main(){ // 读取输入并排序 for(int i=1; i<=n; i++) scanf("%d", a+i); // 调用归并排序计算逆序对 printf("%lld\n", merger_sort(1, n)); return 0; }
三、分数组
思路就是分开奇数和偶数,并对各自的数组进行排序。最后将奇数和偶数分别输出。代码如下:
#include#include using namespace std; int n; int a[1010], b[1010]; cmp(int a, int b){return a > b;} int main(){ // 读取输入并分类 [1] int c1 = 0, c2 = 0; for(int i=0; i > t) if (t & 1) a[c1++] = t; else b[c2++] = t; } // 对奇数和偶数分别排序 sort(a, a + c1, cmp); sort(b, b + c2); // 输出结果 for(int i=0; i
四、寻找特定位置
思路就是先将数组排序,然后每隔四个元素检查是否有不符合规则的情况。一旦找到不符合的情况,就输出该元素并结束程序。这个方法的时间复杂度为O(n),在大数据量下显然更高效。代码如下:
#include#include using namespace std; long long a[100010]; int main(){ int n; cin >> n; for(int i=0; i
这些代码都是针对具体问题的最佳解决方案,既保证了时间复杂度又满足了题目的具体要求。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年04月24日 22时46分38秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
2020年云南省专升本 - 「计算机」专业各院校招生计划
2019-03-17
Android 四大组件、五大存储、六大布局总结
2019-03-17
算法 顺序查找/折半查找/冒泡排序/选择排序(待改)
2019-03-17
Rancher从入门到精通-2.0 配置gitlab代码库 404页面 原因有点扯
2019-03-17
ProgresSql 连接 ssl off 错误
2019-03-17
浏览器打开winscp 系统错误。代码:5。 拒绝访问。
2019-03-17
Kubernetes 无法查询到并且无法删除pod实例的排查过程
2019-03-17
android中button修改不了背景颜色
2019-03-17
uniapp自定义弹窗组件|仿微信android/ios弹窗效果
2019-03-17
(网络安全)主动信息收集 操作系统识别
2019-03-17
redis教程-redis环境搭建安装(qq:1197852132)
2019-03-17
github 入门
2019-03-17
学生信息管理系统之增(五):添加用户信息流程
2019-03-21
社区医疗app-Ui设计
2019-03-21
HTML 表单验证
2019-03-21
mysql时间为0000-00-00 00:00:00时,程序读取错误
2019-03-21
ubuntu System program problem detected
2019-03-21
使用ivx图表组件的经验总结
2019-03-21