时间限制: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()
}
}