7-8 第X大的数 (20 分)

题目描述:

X最近爱上了区间查询问题,给出N (N <= 100000) 个数,然后进行M (M <= 50) 次询问,每次询问时,输入一个数X (1 <= X <= N),输出N个数中第X大的数。

输入格式:

首先输入一个整数N,代表有N个数,下面一行包含N个整数,用空格隔开。然后为一个整数M,代表有M次询问,下面的M行,每行一个整数X。

输出格式:

输出N个数中第X大的数。

输入样例:

4
1 2 2 3
4
1
2
3
4

输出样例:

在这里给出相应的输出。例如:

3
2
2
1
#include<stdio.h>
int a[100000];
void sort(int l,int r)
{
    int key=a[l];
    int i=l,j=r;
    while(i<j)
    {
        while(i<j&&key>=a[j])j--;
        a[i]=a[j];
        while(i<j&&key<=a[i])i++;
        a[j]=a[i];
    }
    a[i]=key;
    if(l<r)
    {
        sort(l,i-1);
        sort(i+1,r);
    }
}
 
int main()
{
    int n,i,m;
    int x;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=0;i<n;i++)
        {
        scanf("%d",&a[i]);
        }
        sort(0,n-1);
        scanf("%d",&m);
        while(m--)
        {
           scanf("%d",&x);
           printf("%d\n",a[x-1]);
        }
    }
    return 0;
}

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
遗传算法是一种优化算法,适用于求解复杂的非线性问题。本题中,我们需要求解一个函数的最小值,可以使用遗传算法来实现。 遗传算法的基本步骤如下: 1. 初始化种群。生成一些随机的个体,作为种群的初始集合。 2. 评估适应度。对每个个体计算适应度值,即函数的取值。 3. 选择。根据适应度值选择一些个体,用于生成下一代种群。 4. 交叉。对选择的个体进行交叉操作,产生新的后代个体。 5. 变异。对新的后代个体进行变异操作,增加种群的多样性。 6. 替换。用新的后代个体替换原来的个体,产生下一代种群。 7. 重复执行2-6步,直到满足停止条件。 在本题中,我们可以将 x 的范围限定在 [0, 40] 内,并将目标函数转换为最小化问题。然后,可以采用二进制编码的方法表示个体,将每个个体看作一个长度为 n 的二进制串,其中 n 为编码位数。可以将 [0, 40] 均匀划分为若干个区间,每个区间对应一个二进制编码。例如,当 n=6 时,可以将 [0, 40] 划分为 64 个子区间,每个子区间对应一个 6 位二进制编码。 初始化种群时,可以随机生成若干个二进制串作为个体,用于构建初始种群。在评估适应度时,可以将每个个体的二进制编码转换为对应的实数值,并代入目标函数计算适应度值。在选择操作中,可以使用轮盘赌选择算法,按照适应度值的大小来选择个体。在交叉和变异操作中,可以使用单点交叉和随机变异等操作,增加种群的多样性。 当满足停止条件时,即可得到最优解。停止条件可以根据实际情况进行设置,例如达到最大迭代次数、目标函数值收敛等。 使用遗传算法求解本题的具体步骤如下: 1. 确定编码位数 n,初始种群大小和停止条件。 2. 随机生成若干个长度为 n 的二进制串作为个体,构建初始种群。 3. 将每个个体的二进制编码转换为对应的实数值,并代入目标函数计算适应度值。 4. 根据适应度值选择一些个体,用于生成下一代种群。 5. 对选择的个体进行交叉操作,产生新的后代个体。 6. 对新的后代个体进行变异操作,增加种群的多样性。 7. 用新的后代个体替换原来的个体,产生下一代种群。 8. 重复执行3-7步,直到满足停止条件,得到最优解。 具体实现时,可以使用 Python 的 NumPy 库实现二进制编码和目标函数的计算,使用 Matplotlib 库可视化适应度值的变化。下面是一个简单的示例代码:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

救救孩子√

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值