csp-j2020直播获奖题分析及代码

img

img

img


这是csp-j2020直播获奖,洛谷的一题,能不能讲解一下题并把代码贴出来看看

随着输入不断的排序,找出前w%的最低分数线
代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>

void sort(int a[], int n)
{
    int i, j, t;
    for (i = 0; i < n - 1; i++)
    {
        for (j = 0; j < n - 1 - i; j++)
        {
            if (a[j] < a[j + 1]) //从大到小排序
            {
                t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;
            }
        }
    }
}


int max(int a, int b)
{
    if (a > b) return a;
    else return b;
}

int main()
{
    int n, w;
    int* sc; //存储成绩
    int i, ps; //ps代表当前的获奖人数
    scanf("%d %d", &n, &w);
    sc = (int*)malloc(sizeof(int) * n);

    for ( i = 0; i < n; i++)
    {
        scanf("%d", &sc[i]);
        sort(sc, i + 1);
        ps = max(1, (i + 1) * w / 100.0); //当前的获奖人数
        if(i<n-1)
            printf("%d ", sc[ps - 1]);
        else
            printf("%d", sc[ps - 1]);
    }
    return 0;
}


这个就是个双循环。循环输入成绩,然后进行成绩降序排序,取当前人数的百分比人数作为下标,输出该下标对应的成绩就行

#include <stdio.h>
int main()
{
    int i,j,n,per,a[10000],t,k;
    double m;
    scanf("%d%d",&n,&per);
    for(i=0;i<n;i++)
    {
        scanf("%d",&t);
        for(j=0;j<i;j++)
        {
            if(a[j] <t)
            {
                for(k=i-1;k>=j;k--)
                    a[k+1] = a[k];
                a[j] = t;
                break;
            }
        }
        if(j==i)
            a[i] = t;
        m = (i+1)*per/100.0+0.0001;
        if(m>0)
            m--;
        printf("%d ",a[(int)m]);
    }
    return 0;
}

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632