#P3661. 第3题-跑步竞赛
-
ID: 3004
Tried: 13
Accepted: 11
Difficulty: 2
所属公司 :
中国电信
时间 :25年9月13日场
-
算法标签>排序
第3题-跑步竞赛
思路
- 设跑道一圈长度为 L,某选手已跑总距离为 Di=L⋅xi+yi。由于 L 对所有人相同且 L>0,比较大小等价于按二元组 (xi,yi) 的字典序比较:x 大者在前,x 相同则比较 y。
- 统计人数 k 满足 xi>xa 或 (xi=xa∧yi>ya),则答案为 k+1。
- 复杂度:时间 O(1),空间 O(1)。
C++
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
// 读取 a, b, c, d 的 (x, y)
int xa, ya, xb, yb, xc, yc, xd, yd;
if (!(cin >> xa >> ya)) return 0;
cin >> xb >> yb;
cin >> xc >> yc;
cin >> xd >> yd;
// 计算比 a 靠前的人数
auto ahead = [&](int x, int y) {
// 若 x 更大,或者 x 相等但 y 更大,则该选手在 a 前面
return (x > xa) || (x == xa && y > ya);
};
int k = 0;
if (ahead(xb, yb)) ++k;
if (ahead(xc, yc)) ++k;
if (ahead(xd, yd)) ++k;
// 名次 = 前方人数 + 1
cout << (k + 1) << "\n";
return 0;
}
Python
import sys
# 读取 a, b, c, d 的 (x, y)
lines = [list(map(int, sys.stdin.readline().split())) for _ in range(4)]
(xa, ya) = lines[0]
(xb, yb) = lines[1]
(xc, yc) = lines[2]
(xd, yd) = lines[3]
# 判断是否在 a 前面
def ahead(x, y):
# x 更大,或 x 相等且 y 更大,则在 a 前面
return (x > xa) or (x == xa and y > ya)
k = 0
k += 1 if ahead(xb, yb) else 0
k += 1 if ahead(xc, yc) else 0
k += 1 if ahead(xd, yd) else 0
# 名次 = 前方人数 + 1
print(k + 1)
Java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
// 工具:解析一行两个整数
private static int[] readPair(BufferedReader br) throws IOException {
String line;
while ((line = br.readLine()) != null && line.trim().isEmpty()) {}
String[] parts = line.trim().split("\\s+");
return new int[]{Integer.parseInt(parts[0]), Integer.parseInt(parts[1])};
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 读取 a, b, c, d 的 (x, y)
int[] a = readPair(br);
int[] b = readPair(br);
int[] c = readPair(br);
int[] d = readPair(br);
int xa = a[0], ya = a[1];
// 判断是否在 a 前面
java.util.function.BiPredicate<Integer, Integer> ahead = (x, y) ->
(x > xa) || (x == xa && y > ya);
int k = 0;
if (ahead.test(b[0], b[1])) k++;
if (ahead.test(c[0], c[1])) k++;
if (ahead.test(d[0], d[1])) k++;
// 名次 = 前方人数 + 1
System.out.println(k + 1);
}
}
题目内容
有 a,b,c,d 四人同时在一个环形跑道上进行跑步比赛。给定每位选手已完成的圈数 xi 以及当前所在圈内距离起点的距离 yi ,请判定选手 a 当前的名次。
保证所有选手跑过的总距离两两不同,故不存在并列名次。
输入描述
共四行,每行输入两个整数 x 与 y(1≤x,y≤100) ,依次表示选于 a,b,c,d 已完成的圈数和当前圈内距离起点的距离(保证每个位置互不相同)。
输出描述
输出一个整数,表示选手 a 当前的名次。
样例1
输入
3 20
3 30
2 50
3 15
输出
2
说明
在该样例中,选手 b 的状态为 x=3,y=30 ,跑得最远,故 b 排第 1 ;而 a 排第 2 。