找回密码
 立即注册!
搜索

小喇叭+ 发布

系统消息:尊敬的用户,动象论坛的邮件系统已经完美修复,您现在可以顺利使用自助注册和找回密码功能了。万分感谢你对动象论坛的喜爱与支持~
06-10 15:28
系统消息:很抱歉的通知您,当前论坛的邮件系统暂时出现故障,因此自助注册和找回密码的功能将无法使用。如有任何需要,您可以直接添加客服QQ:230273459进行人工操作。对此给您带来的不便,我们深感歉意。
06-10 09:11
admin动象论坛祝大家端午快乐~悠悠粽草,人间芳华,年年岁岁皆如愿,岁岁年年长安康。
06-10 09:09
系统消息:动象论坛祝大家高考加油~
06-09 15:13
系统消息:各位坛友,由于“两会”封网原因,动象论坛服务中止了约一个星期,对于由此给您造成的麻烦我们感到万分抱歉。
03-18 23:04
admin动象论坛在这里祝大家2024龙年新年快乐~
02-09 14:58
系统消息:论坛端口问题已经解决~您可以直接访问论坛域名mcmc.ltd(www.mcmc.ltd)啦~(Tips:如访问时提示“连接被重置”报错,请清空您的DNS缓存与浏览器缓存。)
02-05 19:14
系统消息:论坛预计今天晚间将端口问题修复完成,请留意论坛动态,感谢您对动象论坛的支持~
02-05 14:06
系统消息:动象论坛目前正在紧急迁移服务器,目前请您先访问https://mcmc.ltd:150。论坛正在全力找CDN以修复端口问题,由此给您造成影响亿常抱歉。。
02-05 11:23
系统消息:动象论坛祝大家2024年新年快乐吖~祝大家前路浩浩荡荡,万事皆可期待~
12-31 22:41
系统消息:动象论坛拟于7月20日至7月21日进行服务器迁移和域名更换,届时论坛服务将暂时不可用。对此给您带来的麻烦,我们感到十分抱歉。
07-18 19:51
Mozillahello world
07-04 17:39
系统消息:高考倒计时2天!动象论坛祝大家2023高考完胜!加油!!!!!!
06-04 23:44
神秘人:
03-21 07:20
系统消息:向各位论坛坛友公开一下,我们现在吸收了@luoying2334 为论坛管理团队成员,管理讨论区、软件分享区和得闲饮茶区。如您有任何质疑,请您在【意见与建议】版块发帖,感谢您的支持~
03-20 23:23
admin论坛没啥人气啊emmm,欢迎大家来推荐退荐~
03-12 22:34
02-05 11:11
luoying2334给我学狗叫啊,三回啊三回
02-05 11:11
Civilmafia追尾黑色高级车
02-04 14:27
Civilmafia仙家军
02-03 19:08
查看: 3668|回复: 26

经典题-第k小的数

[复制链接]

4

主题

25

回帖

242

积分

试剑江湖

积分
242
发表于 2020-7-13 15:13:10 | 显示全部楼层 |阅读模式 IP:江苏苏州
本帖最后由 -墟- 于 2020-7-13 15:15 编辑

题目描述
给定一个长度为n(1≤n≤5000001)的无序正整数序列,以及另一个数k(1≤k≤n)(关于第k小的数:例如序列{1,2,3,4,5,6}中第3小的数是3。)
输入
第一行两个正整数n,k。
第二行为n个正整数。
输出
第k小的数。
样例输入6 3
1 2 3 4 5 6
样例输出
3
HELLO,我是 -墟- ,一名蒻到不能再蒻的超级蒟蒻

4

主题

25

回帖

242

积分

试剑江湖

积分
242
 楼主| 发表于 2020-7-13 15:14:15 | 显示全部楼层 IP:江苏苏州
本帖最后由 -墟- 于 2020-7-13 15:16 编辑

有思路的大佬可以把代码发到评论区,明天发解析版の代码(我太懒了拖到明天)
HELLO,我是 -墟- ,一名蒻到不能再蒻的超级蒟蒻
回复

使用道具 举报

11

主题

57

回帖

585

积分

清正廉明~版主

风纪委员

积分
585

最佳新人活跃会员

发表于 2020-7-15 11:29:08 | 显示全部楼层 IP:浙江嘉兴
  1. #include<iostream>
  2. using namespace std;
  3. int main(){
  4.     int n,k;
  5.     cin>>n>>k;
  6.     int a[n];
  7.     int b[k];
  8.     for(int i=0;i<k;i++){
  9.         b[i]=5001;
  10.     }
  11.     for(int i=0;i<n;i++){
  12.         cin>>a[i];
  13.     }
  14.     int i=0;
  15.     while(i<n){
  16.         //cout<<i<<endl;
  17.         for(int j=0;j<k;j++){
  18.             if(b[j]>=a[i]){
  19.     for(int p=k-1;p>j;p--){
  20.                     b[p]=b[p-1];
  21.                 }
  22.                 b[j]=a[i];
  23.                 break;
  24.        }
  25. }
  26. i+=1;
  27.     }
  28.     cout<<b[k-1]<<endl;
  29.     return 0;
  30. }
复制代码

五星好评走一波~~~~~

评分

参与人数 1比特币 +200 收起 理由
admin + 200 赞一个!

查看全部评分


tel:181 5707 6602
回复

使用道具 举报

4

主题

25

回帖

242

积分

试剑江湖

积分
242
 楼主| 发表于 2020-7-15 15:13:58 | 显示全部楼层 IP:江苏苏州
实属惨烈
HELLO,我是 -墟- ,一名蒻到不能再蒻的超级蒟蒻
回复

使用道具 举报

4

主题

25

回帖

242

积分

试剑江湖

积分
242
 楼主| 发表于 2020-7-15 15:15:08 | 显示全部楼层 IP:江苏苏州
本帖最后由 -墟- 于 2020-7-15 15:22 编辑

这道题其实就是快速选择。看看n的大小,5000000,就算先sort一遍还是TLE,这个时候就应该从快排的角度去思考。每一次都会将k所在的位置的范围缩小,时间复杂度也是比快排还要低的(懒得估)。标准答案
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int n, k, a[5000001];

  4. void read() { //快读,一定要用
  5.         char ch;
  6.         ch = getchar();
  7.         int f;
  8.         for(int i = 0; i < n; i++) {
  9.                 f = 1;
  10.                 while(ch < '0' || ch > '9') {
  11.                         if(ch == '-')
  12.                                 f = -1;
  13.                         ch = getchar();
  14.                 }
  15.                 while(ch >= '0' && ch <= '9') {
  16.                         a[i] = a[i] * 10 + ch - '0';
  17.                         ch = getchar();
  18.                 }
  19.                 a[i] *= f;
  20.         }
  21. }

  22. int partition(int l, int r) { //用快排的方法,左边的永远大于右边的
  23.         int pivot = a[l], left = l + 1, right = r;
  24.         while(left <= right) {
  25.                 while(left <= right && a[left] <= pivot) {
  26.                         left++;
  27.                 }
  28.                 while(left <= right && a[right] > pivot) {
  29.                         right--;
  30.                 }
  31.                 if(left < right) {
  32.                         swap(a[left], a[right]);
  33.                 }
  34.         }
  35.         swap(a[l], a[right]);
  36.         return right;
  37. }

  38. int quickSelect(int l, int r, int k) { //如果第k个在左边就只在左边进行下一轮,在右边就在右边进行,正好是partition返回值则返回这个数
  39.         if(l == r) {
  40.                 return a[l];
  41.         }
  42.         int p = partition(l, r);
  43.         if(p == k - 1) {
  44.                 return a[p];
  45.         }else if(p < k - 1) {
  46.                 return quickSelect(p + 1, r, k);
  47.         }else {
  48.                 return quickSelect(l, p - 1, k);
  49.         }
  50. }

  51. int main() {
  52.         scanf("%d%d", &n, &k);
  53.         read();
  54.         cout << quickSelect(0, n - 1, k);
  55.         return 0;
  56. }
复制代码
HELLO,我是 -墟- ,一名蒻到不能再蒻的超级蒟蒻
回复

使用道具 举报

4

主题

25

回帖

242

积分

试剑江湖

积分
242
 楼主| 发表于 2020-7-15 15:24:33 | 显示全部楼层 IP:江苏苏州
黄蕊小白花 发表于 2020-7-15 11:29
五星好评走一波~~~~~

20分,TLE了
HELLO,我是 -墟- ,一名蒻到不能再蒻的超级蒟蒻
回复

使用道具 举报

11

主题

57

回帖

585

积分

清正廉明~版主

风纪委员

积分
585

最佳新人活跃会员

发表于 2020-7-15 18:36:15 来自手机 | 显示全部楼层 IP:浙江嘉兴
-墟- 发表于 2020-7-15 15:24
20分,TLE了

20分是高是低
[我是一个默认签名,快去设置里设置一个个性签名吧(*^ワ^*)] 动象论坛欢迎您!(´∇ノ`*)ノ
回复

使用道具 举报

666

261

主题

1391

回帖

1万

积分

清正廉明~管理员

用心做好论坛,用心创造精品!

积分
10642

最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

QQ
发表于 2020-7-15 19:37:30 | 显示全部楼层 IP:

10个点,只过了2个,7个不过,不行哦
估计是超了时、过了内存或者不符合规定
动象论坛
点滴纯粹 简单自然
动象论坛,用心做好论坛!用心创造精品!
[点我进入]www.mjysd.top
回复

使用道具 举报

54

主题

156

回帖

371

积分

试剑江湖

致敬·Mozilla Firefox

积分
371

最佳新人活跃会员

发表于 2020-7-15 19:38:10 | 显示全部楼层 IP:江苏苏州
本帖最后由 Mozilla 于 2020-7-15 19:41 编辑
-墟- 发表于 2020-7-13 15:14
有思路的大佬可以把代码发到评论区,明天发解析版の代码(我太懒了拖到明天) ...

写好了,并且优化了输出和速度。但是python由于要不停滴判断数据类型(还有其他原因),速度从根本上就比C++慢,所以对python的时限应该要放宽。
  1. n=int(input('输入你的n'))
  2. k=int(input('输入你的k'))

  3. num=[]

  4. for i in range(n):
  5.         num1=int(input('输入你的第%s个数'%n))
  6.         n-=1
  7.         num.append(num1)


  8. def bubble(num2):
  9.     for j in range(len(num2)-1):
  10.                
  11.         for i in range(len(num2)-1):
  12.             if num2[i]<num2[i+1]:
  13.                 num2[i+1],num2[i]=num2[i],num2[i+1]



  14. bubble(num)
  15. print(str(num[k-1]))
复制代码

评分

参与人数 1比特币 +200 收起 理由
admin + 200 编程大师I!

查看全部评分

[我是一个默认签名,快去设置里设置一个个性签名吧(*^ワ^*)] 动象论坛欢迎您!(´∇ノ`*)ノ
回复

使用道具 举报

666

261

主题

1391

回帖

1万

积分

清正廉明~管理员

用心做好论坛,用心创造精品!

积分
10642

最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

QQ
发表于 2020-7-15 19:48:16 | 显示全部楼层 IP:
Mozilla 发表于 2020-7-15 19:38
写好了,并且优化了输出和速度。但是python由于要不停滴判断数据类型(还有其他原因),速度从根本上就比C ...

速度还得拿上去遛遛,才知道过不过
动象论坛
点滴纯粹 简单自然
动象论坛,用心做好论坛!用心创造精品!
[点我进入]www.mjysd.top
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册!

本版积分规则

QQ|手机版|小黑屋|网站地图|动象论坛

GMT+8, 2024-9-8 10:09 , Processed in 0.305658 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表