广师oj 2237 - 第k小的数

有n个数,请你找出第k小的数。

输入描述
第一行有2个正整数n,k(n,k<=10^6)
第二行有n个非负数ai(ai<=10^5)

输出描述
输出第k小的数。

样本输入

5 2
1 5 3 4 5

样本输出
3

快排后直接找第k小的数

#include <stdio.h>
#include <algorithm>

using namespace std;

int a[100005];

int main()
{
    int x,y,z,t,k,n;
    scanf("%d%d",&n,&k);
    for(x=0;x<n;x++)
    {
        scanf("%d",&a[x]);
    }
    sort(a,a+n);
    z = 0;
    for(x=0;x<n;x++)
    {
        if(a[x]!=a[x+1])
        {
            z++;
        }
        if(z==k-1)
        {
            printf("%d\n",a[x+1]);
            break;
        }
    }
    return 0;
} 

用数组存k个数,其中最大的数为kmax,输入一个数判断是否比kmax小,如果比kmax小就把kmax替换,再重新排序,找出新的kmax。
但要注意数组中的数字不可以相同。

#include <stdio.h>
#include <algorithm>

using namespace std;
#define Max 10000
int a[100005]={0};

int main()
{
    int x,y,z,t,n,k,num,flag;
    scanf("%d%d",&n,&k);
    for(x=0;x<k;x++)
    {
        a[x] = Max;
    }
    for(x=0;x<n;x++)
    {
        scanf("%d",&t);
        if(t<a[k-1])
        {
            flag = 0;
            for(y=0;y<k;y++)
            {
                if(t==a[y])
                {
                    flag = 1;
                    break;  
                }
            }
            if(!flag)
            {
                a[k-1] = t;
                sort(a,a+k);
            }
        }   
    }
    printf("%d\n",a[k-1]);
    return 0;
}

### 关于 XTU OJ 平台上的 K-Good Number 问题 #### 题目描述 题目要求计算 n 位无前导零的二进制中,“好”的量。所谓“好”,是指该的二进制表示中,码 `1` 的个大于码 `0` 的个--- #### 解题思路 为了求解此问题,可以采用动态规划的方法来高效解决: 1. **状态定义** 定义 `dp[i][j]` 表示 i 位二进制中,有 j 个 `1` 的所有可能组合的量[^5]。 2. **转移方程** 对于每一位二进制,可以选择填入 `0` 或者 `1`: - 填入 `0`: 则当前的状态由上一位少一个位置且相同量的 `1` 转移而来,即 `dp[i][j] += dp[i-1][j]`。 - 填入 `1`: 当前的状态由上一位少一个位置且 `1` 量减少一的情况转移而来,即 `dp[i][j] += dp[i-1][j-1]`。 3. **边界条件** 初始化时,当只有一位二进制时: - 若只有一个 `1` (`dp[1][1]=1`)- 若只有 `0` (`dp[1][0]=1`)。 4. **最终结果** 计算满足条件的结果:对于给定的 n 位二进制,统计其中 `1` 的个严格大于 `0` 的情况总。由于最高位不能为 `0` (因为不允许前导零),因此需要特别处理第一位固定为 `1` 后剩余部分的可能性。 --- #### 动态规划实现代码 以下是基于上述分析的 Python 实现代码: ```python def count_good_numbers(n): MOD = 10**9 + 7 # Initialize DP table with zeros dp = [[0]*(n+1) for _ in range(n+1)] # Base case initialization dp[0][0] = 1 # Fill the DP table using recurrence relations for i in range(1, n+1): # For each bit position from 1 to n for j in range(i+1): # Possible number of '1's at this stage if j > 0: dp[i][j] = (dp[i][j] + dp[i-1][j-1]) % MOD # Case when current bit is '1' dp[i][j] = (dp[i][j] + dp[i-1][j]) % MOD # Case when current bit is '0' result = 0 for ones in range((n//2)+1, n+1): # Count cases where '1' exceeds '0' result = (result + dp[n][ones]) % MOD return result # Example usage if __name__ == "__main__": n = int(input()) print(count_good_numbers(n)) ``` --- #### 复杂度分析 - 时间复杂度: \(O(n^2)\), 主要来源于双重循环填充 DP 表格。 - 空间复杂度: \(O(n^2)\), 使用二维组存储中间状态。 通过优化空间复杂度(仅保留两行据),可进一步降低内存消耗至 \(O(n)\)--- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值