7-64 寻找第k小的数 数据结构 PTA

给定若干整数,请设计一个高效的算法,确定第k小的数。

输入格式:

测试数据有多组,处理到文件尾。每组测试数据的第1行输入2个整数n,k(1≤k≤n≤1000000)。第2行输入n个整数,每个数据的取值范围在0到1000000之间。

输出格式:

对于每组测试,输出第k小的数。

输入样例:

5 3
1 2 2 2 1
9 3
1 2 3 4 5 6 9 8 7

输出样例:

2
3

注:不知道输出几行  

利用 while (scanf("%d %d",&n,&k)!=EOF)代表判断能不能进行下去;

#include<bits/stdc++.h>
using namespace std;
int main()
{int n,k;
    while (scanf("%d %d",&n,&k)!=EOF)//判断输出数据 能就下去
    {
       int a[n];
       for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
        sort(a,a+n);//sort函数排序  不懂可以百度了解
        printf("%d\n",a[k-1]);//输出
    }
    return 0;
}

### 计算第n项斐波那契的解法 #### 使用C++实现迭代方法 在PTA平台上,由于时间复杂度的要求较高,推荐使用迭代方法来计算斐波那契列中的第n项。这种方法的时间复杂度为O(n),空间复杂度为O(1)。以下是基于引用[1]的改进版本: ```cpp #include <iostream> // 迭代方式计算斐波那契 int fibonacci(int n) { if (n <= 1) { return n; } int prev = 0, curr = 1; for (int i = 2; i <= n; ++i) { int next = prev + curr; prev = curr; curr = next; } return curr; } int main() { int n; std::cout << "输入要计算的斐波那契的位置:"; std::cin >> n; int result = fibonacci(n); std::cout << "第" << n << "个斐波那契是:" << result << std::endl; return 0; } ``` 此代码通过循环逐步累加前两项得到当前项的结果[^1]。 --- #### 使用Python实现动态规划方法 对于Python语言来说,可以利用列表存储中间结果的方式进一步优化性能。这种方式同样具有线性时间复杂度O(n),但在实际应用中可能更易于理解和维护: ```python def fibonacci(n): if n <= 1: return n fib = [0, 1] for i in range(2, n + 1): fib.append(fib[-1] + fib[-2]) return fib[n] if __name__ == "__main__": n = int(input("输入要计算的斐波那契的位置:")) result = fibonacci(n) print(f"第{n}个斐波那契是:{result}") ``` 上述代码展示了如何借助组保存历史据从而减少重复计算的需求[^4]。 --- #### 关于递归方法的局限性 尽管递归是一种直观且简洁的方式来表达斐波那契序列定义,但它存在严重的效率问题——即指级增长的子问题量。因此,在处理较大的`n`值时容易引发栈溢出错误或者超出允许执行时限的情况。正如引用[2]所提到,“当n很大时...会提示运行超时”。为了避免这些问题的发生,建议优先考虑非递归解决方案如上文提及者那样[^2]。 --- #### PTA平台上的注意事项 针对像SDUT这样的在线评测系统提交作业时,注意以下几点事项: - **输入输出格式严格匹配**:确保按照题目描述给出的确切形式读取用户输入并打印最终答案; - **边界条件测试充分覆盖**:特别关注极端情况下的行为表现比如负索引或是零作为参传入的情形; - **算法效率满足需求**:鉴于大多竞赛型试题都设定了严格的资源消耗上限(CPU时间和内存占用),所以务必选用高效数据结构与操作流程设计程序逻辑; 综上所述,无论是采用哪种具体的编码风格完成任务目标,都需要紧密结合具体应用场景做出合理权衡决策[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值