洛谷题目:计算得分 求助
本帖最后由 学习编程中的Ben 于 2023-7-29 22:12 编辑洛谷题目:计算得分(T257878 计算得分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))
计算得分
题目描述
S 市对所有报名参加CSP的选手进行了第一轮,第一轮分数达到分数线的选手方可进入第二轮。分数线根据计划获奖人数的 150% 划定,即如果计划获奖 m 人,则分数线为排名第 m * 150%(向下取整)名的选手的分数,而最终进入第二轮的选手为第一轮成绩不低于第二轮分数线的所有选手。
现在就请你编写程序划定进入第二轮分数线,并输出所有进入第二轮的选手的报名号和第一轮成绩。
输入格式
第一行,两个整数 n,m(5 <= n <= 5000,3 <= m <= n),中间用一个空格隔开,其中 n 表示报名参加第一轮的选手总数,m 表示计划获奖的人数。输入数据保证 m * 150% 向下取整后小于等于 n。
第二行到第 n+1 行,每行包括两个整数,中间用一个空格隔开,分别是选手的报名号 k(1000 <= k <= 9999)和该选手的第一轮成绩 s(1 <= s <= 100)。数据保证选手的报名号各不相同。
输出格式
第一行,有 2 个整数,用一个空格隔开,第一个整数表示入围分数线;第二个整数为进入第二轮的选手的实际人数。
从第二行开始,每行包含 2 个整数,中间用一个空格隔开,分别表示进入第二轮的选手的报名号和第一轮成绩,按照第一轮成绩从高到低输出,如果成绩相同,则按报名号由小到大的顺序输出。
样例 #1
样例输入 #1
6 3
1000 90
3239 88
2390 95
7231 84
1005 95
1001 88
样例输出 #1
88 5
1005 95
2390 95
1000 90
1001 88
3239 88
提示
【样例说明】
m×150%=3×150%=4.5,向下取整后为 4。保证 4 个人进入第二轮的分数线为 88,但因为 88 有重分,所以所有成绩大于等于 88 的选手都可以进入第二轮,故最终有 5 个人进入第二轮。
我要人工回答!!!
不好意思,我是一个人工智能语言模型,无法执行或编译代码。但我可以解释如何解决这个洛谷题目: "计算得分"。
这个题目的目标是找出进入第二轮的选手和分数线。根据题目描述,分数线为排名第 n×150%m×150%(向下取整)名的选手的分数,而最终进入第二轮的选手为第一轮成绩不低于第二轮分数线的所有选手。
首先,我们需要读取输入数据。输入数据的格式为:第一行包含两个整数 n 和 m,中间用一个空格隔开,表示选手总数和计划获奖的人数。接下来的 n 行,每行包含两个整数,表示选手的报名号和第一轮成绩。
接下来,我们需要找出分数线。计算分数线的方法是:将第一轮成绩按照从高到低排序,然后找出排名第 n×150%m×150% 名的选手,其分数即为分数线。
然后,我们可以遍历所有的选手,找出第一轮成绩不低于分数线的选手,并将他们按照成绩从高到低排序。最后输出分数线和进入第二轮的选手的报名号和第一轮成绩。
以下是代码的伪代码表示:
# 读取输入数据
读取 n, m
选手列表 = []
循环 n 次:
读取 报名号, 第一轮成绩
将 (报名号, 第一轮成绩) 添加到 选手列表
# 找出分数线
将 选手列表 按照 第一轮成绩 从高到低排序
分数线位置 = 向下取整(n * 150 / m * 1.5) - 1
分数线 = 选手列表[分数线位置]
# 找出进入第二轮的选手
进入第二轮选手 = []
循环选手列表:
如果 第一轮成绩 >= 分数线:
将 (报名号, 第一轮成绩) 添加到 进入第二轮选手
# 输出结果
输出 分数线, 进入第二轮选手 的长度
循环 进入第二轮选手:
输出 报名号, 第一轮成绩
请注意,以上是伪代码,并非可执行代码。你可以根据这个思路来实现你的程序。希望这能对你有所帮助!如果你遇到了具体的问题,欢迎随时向我询问。 根据题目描述,我们需要编写一个程序来确定进入第二轮的分数线,并输出所有进入第二轮的选手的报名号和第一轮成绩。
以下是解题步骤:
1. 读取输入的两个整数 n 和 m(分别表示选手总数和计划获奖人数)。
2. 计算出分数线的排名 thresh = n * 150% / m。
3. 创建一个列表 scores,用于存储每个选手的报名号和第一轮成绩。
4. 读取 n 行输入,将每个选手的报名号和第一轮成绩添加到 scores 列表中。
5. 对 scores 列表按照第一轮成绩从高到低进行排序,如果成绩相同,则按照报名号由小到大进行排序。
6. 输出分数线 thresh 和进入第二轮的选手人数 count = min(m, n)。
7. 输出前 count 行,每行包含选手的报名号和第一轮成绩。
下面是实现该算法的Python代码:
n, m = map(int, input().split())
thresh = n * 150 // m
scores = []
for _ in range(n):
k, s = map(int, input().split())
scores.append((k, s))
scores.sort(key=lambda x: (-x, x))# 按照成绩降序、报名号升序排序
count = min(m, n)
print(thresh, count)
for i in range(count):
print(scores[ i], scores[ i])
希望以上代码和解题步骤对你有帮助!如果有任何疑问,请随时提问。
如果问题已经解决,请设置最佳答案 题目分析
这道题目的主要任务是根据给定的选手报名号和第一轮成绩,确定进入第二轮的分数线,并输出符合条件的选手的报名号和第一轮成绩。
算法思路
1. 读入输入数据,包括选手总数n、计划获奖人数m和每个选手的报名号和第一轮成绩。
2. 将选手按照第一轮成绩从高到低进行排序。
3. 计算进入第二轮的分数线,即第m名选手的成绩。
4. 统计符合条件的选手数量,并记录他们的报名号和第一轮成绩。
5. 输出结果,包括进入第二轮的分数线以及符合条件的选手的报名号和第一轮成绩。
C++代码实现
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Player {
int id;
int score;
};
bool comparePlayer(const Player& p1, const Player& p2) {
if (p1.score == p2.score) {
return p1.id < p2.id;
}
return p1.score > p2.score;
}
int main() {
int n, m;
cin >> n >> m;
vector<Player> players(n);
for (int i = 0; i < n; i++) {
cin >> players.id >> players.score;
}
sort(players.begin(), players.end(), comparePlayer);
int cutoff = players.score;
int count = 0;
for (int i = 0; i < n; i++) {
if (players.score >= cutoff) {
count++;
}
}
cout << cutoff << " " << count << endl;
for (int i = 0; i < count; i++) {
cout << players.id << " " << players.score << endl;
}
return 0;
}
希望以上内容能够帮助到你,如果有任何疑问,请随时提出。
球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
题目地址? tommyyu 发表于 2023-7-29 22:08
题目地址?
https://www.luogu.com.cn/problem/T257878 代码如下
#include<iostream>
#include<math.h>
using namespace std;
int a;
int main()
{
double m ;
int n,xian;
int count = 0;
cin>>n>>m;
for (int i = 1;i<=n;i++)
{
cin>>a;
cin>>a;
}
for (int j = n;j>=1;j--)
{
for (int i = 1;i<j;i++)
{
if (a < a || (a == a && a > a))
{
swap(a,a);
}
}
}
m = m/2 * 3;
m = floor(m);
xian = a[(int)m];
cout<<xian<<" ";
for (int i = 1;i<=n;i++)
{
if (xian <= a)
{
count ++;
}
}
cout<<count<<endl;
for (int i = 1;i<=count;i++)
{
cout<<a<<" "<<a<<endl;
}
}
可AC 给个最佳好不好
页:
[1]