信息学奥赛一本通 1245:不重复地输出数 | OpenJudge NOI 1.11 08:不重复地输出数
【题目链接】
ybt 1245:不重复地输出数
OpenJudge NOI 1.11 08:不重复地输出数
【题目考点】
1. 二分查找
2. 复杂度为O(nlogn)的排序
- 快速排序:时间复杂度O(nlogn),额外空间复杂度O(1),不稳定
- 归并排序:时间复杂度O(nlogn),额外空间复杂度O(n),稳定
【解题思路】
解法1:插入排序+二分查找
维护一个升序数组。
每读入一个数字,先通过二分查找判断数组中是否存在该数字。
- 如果存在,那么就略过。
- 如果不存在,就将该数字通过插入排序的方法插入到数组中,保持数组是升序的。
最后输出整个数组。
解法2:O(nlogn)排序算法
输入数据的规模为10510^5105,可以使用复杂度为O(nlogn)的排序算法将其排序,然后遍历数组,输出时如遇到相同的元素,则只输出一个。
【题解代码】
解法1:插入排序+二分查找
- 手写二分查找
#include<bits/stdc++.h>
using namespace std;
#define N 100005
int a[N], an;
bool isFound(int x)//二分查找数组a中是否存在数值x
{int l = 1, r = an, m;while(l <= r){m = (l + r) / 2;if(x < a[m])r = m - 1;else if(x > a[m])l = m + 1;elsereturn true;}return false;
}
int main()
{int n, x;cin >> n;for(int i = 1; i <= n; i++){cin >> x;if(isFound(x) == false){a[++an] = x;for(int j = an; j > 1; j--)//将x插入升序数组a {if(a[j] < a[j-1])swap(a[j], a[j-1]);elsebreak; }}}for(int i = 1; i <= an; ++i)cout << a[i] << ' ';return 0;
}
- 使用stl函数:binary_search()
#include<bits/stdc++.h>
using namespace std;
#define N 100005
int a[N], an;
int main()
{int n, x;cin >> n;for(int i = 1; i <= n; i++){cin >> x;if(binary_search(a+1, a+1+an, x) == false)//查找数组a从a[1]~a[an]中是否有x {a[++an] = x;for(int j = an; j > 1; j--)//将x插入升序数组a {if(a[j] < a[j-1])swap(a[j], a[j-1]);elsebreak; }}}for(int i = 1; i <= an; ++i)cout << a[i] << ' ';return 0;
}
解法2:O(nlogn)排序
快速排序
- 手写二路快排
#include<bits/stdc++.h>
using namespace std;
#define N 100005
int a[N];
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(i < r)qsort(i, r);
}
int main()
{int n, x;cin >> n;for(int i = 1; i <= n; i++)cin >> a[i];qsort(1, n);//快速排序 cout << a[1] << ' ';for(int i = 2; i <= n; ++i)if(a[i] != a[i-1])//连续相同的数字就不输出了,发现不同的数字再输出 cout << a[i] << ' ';return 0;
}
- 使用stl的sort()排序
#include<bits/stdc++.h>
using namespace std;
#define N 100005
int a[N];
int main()
{int n, x;cin >> n;for(int i = 1; i <= n; i++)cin >> a[i];sort(a+1, a+1+n);//升序排序 cout << a[1] << ' ';for(int i = 2; i <= n; ++i)if(a[i] != a[i-1])//连续相同的数字就不输出了,发现不同的数字再输出 cout << a[i] << ' ';return 0;
}
归并排序
- 手写归并排序
#include<bits/stdc++.h>
using namespace std;
#define N 100005
int a[N], t[N];
void msort(int l, int r)//归并排序
{if(l >= r)return;int m = (l+r)/2;msort(l, m);msort(m+1, r);int ti = l, li = l, ri = m+1;while(li <= m && ri <= r){if(a[li] < a[ri])t[ti++] = a[li++];elset[ti++] = a[ri++];}while(li <= m)t[ti++] = a[li++];while(ri <= r)t[ti++] = a[ri++];for(int i = l; i <= r; ++i)a[i] = t[i];
}
int main()
{int n, x;cin >> n;for(int i = 1; i <= n; i++)cin >> a[i];msort(1, n);//归并排序 cout << a[1] << ' ';for(int i = 2; i <= n; ++i)if(a[i] != a[i-1])//连续相同的数字就不输出了,发现不同的数字再输出 cout << a[i] << ' ';return 0;
}
- 使用stl的stable_sort()排序
#include<bits/stdc++.h>
using namespace std;
#define N 100005
int a[N];
int main()
{int n, x;cin >> n;for(int i = 1; i <= n; i++)cin >> a[i];stable_sort(a+1, a+1+n);//归并排序 cout << a[1] << ' ';for(int i = 2; i <= n; ++i)if(a[i] != a[i-1])//连续相同的数字就不输出了,发现不同的数字再输出 cout << a[i] << ' ';return 0;
}
信息学奥赛一本通 1245:不重复地输出数 | OpenJudge NOI 1.11 08:不重复地输出数相关推荐
- 信息学奥赛一本通 1149:最长单词2 | OpenJudge NOI 1.13 16
[题目链接] ybt 1149:最长单词2 OpenJudge NOI 1.13 16:最长单词2 [题目考点] 1. 字符串遍历 2. 处理多个字符串 3. while(cin >> - ...
- 信息学奥赛一本通 1148:连续出现的字符 | OpenJudge NOI 1.9 11
[题目链接] ybt 1148:连续出现的字符 OpenJudge NOI 1.9 11:连续出现的字符 [题目考点] 1. 字符串处理 2. 数值统计 [题解代码] 解法1:比较相邻字符 #incl ...
- 信息学奥赛一本通 1145:字符串p型编码 | OpenJudge NOI 1.7 31:字符串p型编码
[题目链接] ybt 1145:字符串p型编码 OpenJudge NOI 1.7 31:字符串p型编码 [题目考点] 1. 字符串处理 [解题思路] 遍历字符串,设置变量curNum表示当前关注的数 ...
- 信息学奥赛一本通 1143:最长最短单词 | OpenJudge NOI 1.7 25
[题目链接] ybt 1143:最长最短单词 OpenJudge NOI 1.7 25:最长最短单词 [题目考点] 1. 字符串处理 [解题思路] 思路1:将字符串分解为多个单词,而后求出各个单词的长 ...
- 信息学奥赛一本通 1121:计算矩阵边缘元素之和 | OpenJudge NOI 1.8 03:计算矩阵边缘元素之和
[题目链接] ybt 1121:计算矩阵边缘元素之和 OpenJudge NOI 1.8 03:计算矩阵边缘元素之和 [题目考点] 1. 二维数组 [解题思路] 解法1:遍历外圈 一个m行n列的矩阵, ...
- 信息学奥赛一本通 1045:收集瓶盖赢大奖 | OpenJudge NOI 1.4 07
[题目链接] ybt 1045:收集瓶盖赢大奖 OpenJudge NOI 1.4 07:收集瓶盖赢大奖 [题目考点] 1. 逻辑运算符:或 || 逻辑表达式a || b a与b的值都是false时, ...
- 信息学奥赛一本通 1042:奇偶ASCII值判断 | OpenJudge NOI 1.4 04
[题目链接] ybt 1042:奇偶ASCII值判断 OpenJudge NOI 1.4 04:奇偶ASCII值判断 [题目考点] 1. if-else语句 2. 三目运算符?: 3. 判断奇数偶数 ...
- 信息学奥赛一本通 1037:计算2的幂 | OpenJudge NOI 1.3 20
[题目链接] ybt 1037:计算2的幂 OpenJudge NOI 1.3 20:计算2的幂 [题目考点] 1. 不同整型数据的范围 类型 占用字节数 可表示数字范围 char 1 -127~12 ...
- 信息学奥赛一本通 1030:计算球的体积 | OpenJudge NOI 1.3 12
[题目链接] ybt 1030:计算球的体积 OpenJudge NOI 1.3 12:计算球的体积 [题目考点] 1. 浮点型常量 如果直接写一个数字,就是一个整型常量,如:10. 如果要表示一个浮 ...
最新文章
- 全新 Sitecore Experience Cloud™ 助推数字体验转型
- 链路负载均衡: 高性能和高安全的同时实现
- python入门教程书-清华大学出版社-图书详情-《Python快速入门精讲》
- 利用curl命令测试服务端
- 动态给div追加html代码,javascript – 动态添加/删除div到html
- 将微服务注册到Eureka Server上
- 学不会的JAVA,消不了的忧愁! 1
- uuid生成_php如何生成 uuid(总结)
- 计算机设备投标标书范本,OA办公自动化系统投标文件(标书范本)
- 《高性能MySQL》第2章~第4章
- iOS底层探索之KVC
- css(二) block,inline和inline-block概念和区别
- 电影下载、播放、制作、转换、各类问题全攻略
- 关于HDS的高端存储设备USPV
- Acwing-4818. 奶牛大学
- 一键重装系统 韩博士装机大师U盘启动一键重装
- SAP CO TCode
- https 请求需要证书,忽略安全证书
- AI在招聘领域的这些应用,你都知道几个?
- 计算机学院嘉年华标题,“芯动盛夏 AI创南航” 计算机学院举办第八届计算机嘉年华...