c语言编程题。。。。题如下。。。

某一比赛的规则如下,参数选手的人数为2n次方(参赛队员的编号为0到2n-1)。所有选手完成比赛后由裁判打分(没有两名选手的得分相同),相邻的两名选手的得分一一pk,淘汰掉... 某一比赛的规则如下,参数选手的人数为2n次方(参赛队员的编号为0到2n-1)。所有选手完成比赛后由裁判打分(没有两名选手的得分相同),相邻的两名选手的得分一一pk,淘汰掉得分低的选手。剩余的相邻选手再一一pk,直到只剩两名选手。进入最后一轮的两个选手pk后,分数高的为冠军,低的为亚军。
如一共有8名参赛队员,得分依次为
1 3 5 7 2 4 6 8
第一轮pk后,剩余的选手得分为
3 7 4 8
第二轮pk后,剩余的选手得分为
7 8
最后得到冠军的得分为8,他的编号为7。
问,亚军的编号是几,得分是多少?
输入要求
先输入一个整数n,表示有n组测试数据。
每组测试数据先输入一个整数m(m<=1024),表示有m个参数选手。
下一行输入m个整数,表示m个选手的得分。
输出要求
对每组测试数据,输出亚军的编号及其得分,中间用空格分开。
假如输入
3
8
1 3 5 7 2 4 6 8
4
1 2 3 4
2
100 101

应当输出
3 7
1 2
0 100
展开
 我来答
laobaitu0322
推荐于2016-11-12 · TA获得超过744个赞
知道小有建树答主
回答量:900
采纳率:33%
帮助的人:628万
展开全部
#include<stdio.h>
#include<stdlib.h>

typedef struct _Node
{
int id;
int score;
struct _Node* next;
struct _Node* prev;
} Node;

int main() {
int n;
scanf("%d", &n);
while(n--) {
int m, i;
scanf("%d", &m);
Node *head = (Node*)malloc(sizeof(Node)), *tail = head;
head->next = NULL;
head->prev = NULL;
for(i = 0; i < m; i++) {
Node *p = (Node*)malloc(sizeof(Node));
scanf("%d", &p->score);
p->id = i;
p->next = NULL;
p->prev = tail;
tail->next = p;
tail = p;
}
while(m > 2) {
Node *p;
for(p = head->next; p; p = p->next->next) {
if(p->score > p->next->score) {
p->next = p->next->next;
free(p->next->prev);
p->next->prev = p;
} else {
p->prev->next = p->next;
p->next->prev = p->prev;
free(p);
}
}
m >>= 1;
}
printf("%d %d\n", (head->next->score < head->next->next->score ? head->next->id : head->next->next->id),
(head->next->score < head->next->next->score ? head->next->score : head->next->next->score));
}
return 0;
}

输入:

3

8

1 3 5 7 2 4 6 8

4

1 2 3 4

2

100 101

输出:

3 7

1 2

0 100

kaixingui2012
2015-01-03 · TA获得超过4.2万个赞
知道大有可为答主
回答量:1.4万
采纳率:81%
帮助的人:6127万
展开全部
这个不难啊,就是两两比较,保留大的数就可以了!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式