bluecode-2024E-比赛的冠亚季军

131 阅读4分钟

时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 128MB,其他语言 256MB
难度:中等
分数:100 OI排行榜得分:14(0.1分数+2难度)

描述

有N (3 <= N < 10000)个运动员,他们的id为0到N-1,他们的实力由一组整数表示。他们之间进行比赛,需要决出冠亚军。比赛的规则是0号和1号比赛,2号和3号比赛,以此类推,每一轮,相邻的运动员进行比赛,获胜的进入下一轮,实力值大的获胜,实力值相等的情况,id小的情况下获胜;轮空的直接进入下一轮。

输入描述

输入一行N个数字代表N个运动员的实力值(0 <= 实力值 <= 10000000000).

输出描述

输出冠亚季军的id,用空格隔开

用例输入 1 **

2 3 4 5

用例输出 1 **

3 1 2

提示

第一轮比赛id为0实力值为2的运动员和id为1实力值为3的运动员比赛,1号胜出进入下一轮争夺冠亚军。

id为2实力值为4的运动员和id为3实力值为5的运动员比赛,3号胜出进入下一轮争夺冠亚军。 

冠亚军比赛,3号胜1号故冠军为3号,亚军为1号。 

2号与0号,比赛进行季军的争夺,2号实力值为4,0号实力值2,故2号胜出,得季军。 冠亚季军为3 1 2

#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    vector<pair<int, int>> nums;
    string input;
    getline(cin, input);
    istringstream iss(input);
    int num, idx = 0;
    while (iss >> num) {
        nums.push_back(make_pair(num, idx));
        idx++;
    }

    while (nums.size() >= 5) {
        vector<pair<int, int>> newNums;
        for (size_t i = 0; i < nums.size() - 1; i += 2) {
            if (nums[i].first >= nums[i + 1].first) {
                newNums.push_back(nums[i]);
            } else {
                newNums.push_back(nums[i + 1]);
            }
        }
        if (nums.size() % 2 == 1) {
            newNums.push_back(nums[nums.size() - 1]);
        }
        nums = newNums;
    }

    if (nums.size() == 3) {
        if (nums[1].first > nums[0].first){
            swap(nums[0], nums[1]);
        }
        for (size_t i = 0; i < 3; i++) {
            cout << nums[i].second << " ";
        }
        cout << endl;
    } else if (nums.size() == 4) {
        pair<int, int> A, B, C, D;
        A = nums[0];
        B = nums[1];
        C = nums[2];
        D = nums[3];
        if (A.first >= B.first) {
            nums[0] = A;
            nums[2] = B;
        } else {
            nums[0] = B;
            nums[2] = A;
        }
        if (C.first >= D.first) {
            nums[1] = C;
            nums[3] = D;
        } else {
            nums[1] = D;
            nums[3] = C;
        }
        if (nums[1].first > nums[0].first) {
            swap(nums[0], nums[1]);
        }
        if (nums[3].first > nums[2].first) {
            swap(nums[2], nums[3]);
        }
        for (size_t i = 0; i < 3; i++) {
            cout << nums[i].second << " ";
        }
        cout << endl;
    }
    return 0;
}
def main():
    # 读取输入并创建带索引的数字对
    input_str = input()
    nums = [(int(num), idx) for idx, num in enumerate(input_str.split())]
    
    # 当数字数量 >= 5 时,每次取相邻两个数的较大者
    while len(nums) >= 5:
        new_nums = []
        for i in range(0, len(nums)-1, 2):
            if nums[i][0] >= nums[i+1][0]:
                new_nums.append(nums[i])
            else:
                new_nums.append(nums[i+1])
        if len(nums) % 2 == 1:
            new_nums.append(nums[-1])
        nums = new_nums
    
    # 处理剩余3个或4个数字的情况
    if len(nums) == 3:
        if nums[1][0] > nums[0][0]:
            nums[0], nums[1] = nums[1], nums[0]
        print(" ".join(str(x[1]) for x in nums))
    
    elif len(nums) == 4:
        A, B, C, D = nums[0], nums[1], nums[2], nums[3]
        if A[0] >= B[0]:
            nums[0], nums[2] = A, B
        else:
            nums[0], nums[2] = B, A
        if C[0] >= D[0]:
            nums[1], nums[3] = C, D
        else:
            nums[1], nums[3] = D, C
            
        if nums[1][0] > nums[0][0]:
            nums[0], nums[1] = nums[1], nums[0]
        if nums[3][0] > nums[2][0]:
            nums[2], nums[3] = nums[3], nums[2]
        print(" ".join(str(x[1]) for x in nums[:3]))

if __name__ == "__main__":
    main()
package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

type Pair struct {
    value int
    index int
}

func main() {
    // 读取输入
    scanner := bufio.NewScanner(os.Stdin)
    scanner.Scan()
    input := scanner.Text()
    numbers := strings.Fields(input)
    
    // 创建带索引的数字对
    nums := make([]Pair, len(numbers))
    for i, num := range numbers {
        val, _ := strconv.Atoi(num)
        nums[i] = Pair{val, i}
    }
    
    // 当数字数量 >= 5 时,每次取相邻两个数的较大者
    for len(nums) >= 5 {
        newNums := []Pair{}
        for i := 0; i < len(nums)-1; i += 2 {
            if nums[i].value >= nums[i+1].value {
                newNums = append(newNums, nums[i])
            } else {
                newNums = append(newNums, nums[i+1])
            }
        }
        if len(nums)%2 == 1 {
            newNums = append(newNums, nums[len(nums)-1])
        }
        nums = newNums
    }
    
    // 处理剩余3个或4个数字的情况
    if len(nums) == 3 {
        if nums[1].value > nums[0].value {
            nums[0], nums[1] = nums[1], nums[0]
        }
        for i := 0; i < 3; i++ {
            fmt.Print(nums[i].index)
            if i < 2 {
                fmt.Print(" ")
            }
        }
        fmt.Println()
    } else if len(nums) == 4 {
        A, B, C, D := nums[0], nums[1], nums[2], nums[3]
        if A.value >= B.value {
            nums[0], nums[2] = A, B
        } else {
            nums[0], nums[2] = B, A
        }
        if C.value >= D.value {
            nums[1], nums[3] = C, D
        } else {
            nums[1], nums[3] = D, C
        }
        
        if nums[1].value > nums[0].value {
            nums[0], nums[1] = nums[1], nums[0]
        }
        if nums[3].value > nums[2].value {
            nums[2], nums[3] = nums[3], nums[2]
        }
        
        for i := 0; i < 3; i++ {
            fmt.Print(nums[i].index)
            if i < 2 {
                fmt.Print(" ")
            }
        }
        fmt.Println()
    }
}