题解 | #字符统计#
[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]);
}
}