题解 | #字符统计#

[NOIP2007]奖学金

https://ac.nowcoder.com/acm/problem/16639

快速排序,c语言

#include<stdio.h>
void quick_paixu(int num[], int sum[], int cn[], int left, int right)
{
    if (left >= right)
    {
        return;
    }
    int i = left;
    int j = right;
    int jizhun = sum[left];
    int jizhun_num = num[left];
    int jizhun_cn = cn[left];
    while (i < j)
    {
        while (i < j && (sum[j] < jizhun || (sum[j] == jizhun && cn[j] < jizhun_cn) || (sum[j] == jizhun && cn[j] == jizhun_cn && num[j] > jizhun_num)))
        {
            j--;
        }
        if (i < j)
        {
            sum[i] = sum[j];
            num[i] = num[j];
            cn[i] = cn[j];

        }
        while (i < j && (sum[i] > jizhun || (sum[i] == jizhun && cn[i] > jizhun_cn) || (sum[i] == jizhun && cn[i] == jizhun_cn && num[i] < jizhun_num)))
        {
            i++;
        }
        if (i < j)
        {
            sum[j] = sum[i];
            num[j] = num[i];
            cn[j] = cn[i];

        }
    }
    sum[i] = jizhun;
    num[i] = jizhun_num;
    cn[i] = jizhun_cn;
    quick_paixu(num, sum, cn, left, i - 1);
    quick_paixu(num, sum, cn, i + 1, right);
}

int main() {
    int n;
    scanf("%d", &n);
    int num[1000];
    int sum[1000];
    int cn[1000];
    int math[1000];
    int english[1000];
    for (int i = 1; i <= n; i++)
    {
        num[i] = i;
        scanf("%d %d %d", &cn[i], &math[i], &english[i]);
        sum[i] = cn[i] + math[i] + english[i];
    }
    quick_paixu(num, sum, cn, 1, n);
    for (int i = 1; i <= 5; i++)
    {
        printf("%d %d\n", num[i], sum[i]);
    }

}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务