鱼C论坛

 找回密码
 立即注册
查看: 1975|回复: 8

[已解决]洛谷题目:计算得分 求助

[复制链接]
发表于 2023-7-29 22:04:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 学习编程中的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

  1. 6 3
  2. 1000 90
  3. 3239 88
  4. 2390 95
  5. 7231 84
  6. 1005 95
  7. 1001 88
复制代码


样例输出 #1

  1. 88 5
  2. 1005 95
  3. 2390 95
  4. 1000 90
  5. 1001 88
  6. 3239 88
复制代码


提示

【样例说明】

m×150%=3×150%=4.5,向下取整后为 4。保证 4 个人进入第二轮的分数线为 88,但因为 88 有重分,所以所有成绩大于等于 88 的选手都可以进入第二轮,故最终有 5 个人进入第二轮。
[color=rgba(0, 0, 0, 0.75)]

我要人工回答!!!

最佳答案
2023-7-29 23:15:33
代码如下
  1. #include<iostream>
  2. #include<math.h>
  3. using namespace std;
  4. int a[50010][3];
  5. int main()
  6. {
  7.         double m ;
  8.         int n,xian;
  9.         int count = 0;
  10.         cin>>n>>m;
  11.         for (int i = 1;i<=n;i++)
  12.         {
  13.         cin>>a[i][1];
  14.         cin>>a[i][2];
  15.         }
  16.         for (int j = n;j>=1;j--)
  17.         {
  18.        
  19.                 for (int i = 1;i<j;i++)
  20.                 {
  21.                         if (a[i][2] < a[i+1][2] || (a[i][2] == a[i+1][2] && a[i][1] > a[i+1][1]))
  22.                         {
  23.                                 swap(a[i],a[i+1]);
  24.                         }
  25.                 }
  26.         }
  27.         m = m/2 * 3;
  28.         m = floor(m);
  29.         xian = a[(int)m][2];
  30.         cout<<xian<<" ";
  31.         for (int i = 1;i<=n;i++)
  32.         {
  33.                 if (xian <= a[i][2])
  34.                 {
  35.                         count ++;
  36.                 }
  37.         }
  38.         cout<<count<<endl;
  39.         for (int i = 1;i<=count;i++)
  40.         {
  41.                 cout<<a[i][1]<<" "<<a[i][2]<<endl;
  42.         }
  43.        
  44. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-7-29 22:04:36 | 显示全部楼层
不好意思,我是一个人工智能语言模型,无法执行或编译代码。但我可以解释如何解决这个洛谷题目: "计算得分"。

这个题目的目标是找出进入第二轮的选手和分数线。根据题目描述,分数线为排名第 n×150%m×150%(向下取整)名的选手的分数,而最终进入第二轮的选手为第一轮成绩不低于第二轮分数线的所有选手。

首先,我们需要读取输入数据。输入数据的格式为:第一行包含两个整数 n 和 m,中间用一个空格隔开,表示选手总数和计划获奖的人数。接下来的 n 行,每行包含两个整数,表示选手的报名号和第一轮成绩。

接下来,我们需要找出分数线。计算分数线的方法是:将第一轮成绩按照从高到低排序,然后找出排名第 n×150%m×150% 名的选手,其分数即为分数线。

然后,我们可以遍历所有的选手,找出第一轮成绩不低于分数线的选手,并将他们按照成绩从高到低排序。最后输出分数线和进入第二轮的选手的报名号和第一轮成绩。

以下是代码的伪代码表示:

  1. # 读取输入数据
  2. 读取 n, m
  3. 选手列表 = []
  4. 循环 n 次:
  5.     读取 报名号, 第一轮成绩
  6.     将 (报名号, 第一轮成绩) 添加到 选手列表

  7. # 找出分数线
  8. 将 选手列表 按照 第一轮成绩 从高到低排序
  9. 分数线位置 = 向下取整(n * 150 / m * 1.5) - 1
  10. 分数线 = 选手列表[分数线位置][1]

  11. # 找出进入第二轮的选手
  12. 进入第二轮选手 = []
  13. 循环选手列表:
  14.     如果 第一轮成绩 >= 分数线:
  15.         将 (报名号, 第一轮成绩) 添加到 进入第二轮选手

  16. # 输出结果
  17. 输出 分数线, 进入第二轮选手 的长度
  18. 循环 进入第二轮选手:
  19.     输出 报名号, 第一轮成绩
复制代码


请注意,以上是伪代码,并非可执行代码。你可以根据这个思路来实现你的程序。希望这能对你有所帮助!如果你遇到了具体的问题,欢迎随时向我询问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-29 22:04:36 | 显示全部楼层
根据题目描述,我们需要编写一个程序来确定进入第二轮的分数线,并输出所有进入第二轮的选手的报名号和第一轮成绩。

以下是解题步骤:

1. 读取输入的两个整数 n 和 m(分别表示选手总数和计划获奖人数)。
2. 计算出分数线的排名 thresh = n * 150% / m。
3. 创建一个列表 scores,用于存储每个选手的报名号和第一轮成绩。
4. 读取 n 行输入,将每个选手的报名号和第一轮成绩添加到 scores 列表中。
5. 对 scores 列表按照第一轮成绩从高到低进行排序,如果成绩相同,则按照报名号由小到大进行排序。
6. 输出分数线 thresh 和进入第二轮的选手人数 count = min(m, n)。
7. 输出前 count 行,每行包含选手的报名号和第一轮成绩。

下面是实现该算法的Python代码:

  1. n, m = map(int, input().split())
  2. thresh = n * 150 // m

  3. scores = []
  4. for _ in range(n):
  5.     k, s = map(int, input().split())
  6.     scores.append((k, s))

  7. scores.sort(key=lambda x: (-x[1], x[0]))  # 按照成绩降序、报名号升序排序

  8. count = min(m, n)
  9. print(thresh, count)
  10. for i in range(count):
  11.     print(scores[ i][0], scores[ i][1])
复制代码


希望以上代码和解题步骤对你有帮助!如果有任何疑问,请随时提问。
如果问题已经解决,请设置最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-29 22:05:14 | 显示全部楼层
题目分析

这道题目的主要任务是根据给定的选手报名号和第一轮成绩,确定进入第二轮的分数线,并输出符合条件的选手的报名号和第一轮成绩。

算法思路

1. 读入输入数据,包括选手总数n、计划获奖人数m和每个选手的报名号和第一轮成绩。
2. 将选手按照第一轮成绩从高到低进行排序。
3. 计算进入第二轮的分数线,即第m名选手的成绩。
4. 统计符合条件的选手数量,并记录他们的报名号和第一轮成绩。
5. 输出结果,包括进入第二轮的分数线以及符合条件的选手的报名号和第一轮成绩。

C++代码实现
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5. struct Player {
  6.     int id;
  7.     int score;
  8. };
  9. bool comparePlayer(const Player& p1, const Player& p2) {
  10.     if (p1.score == p2.score) {
  11.         return p1.id < p2.id;
  12.     }
  13.     return p1.score > p2.score;
  14. }
  15. int main() {
  16.     int n, m;
  17.     cin >> n >> m;
  18.    
  19.     vector<Player> players(n);
  20.     for (int i = 0; i < n; i++) {
  21.         cin >> players[i].id >> players[i].score;
  22.     }
  23.     sort(players.begin(), players.end(), comparePlayer);
  24.     int cutoff = players[m - 1].score;
  25.     int count = 0;
  26.     for (int i = 0; i < n; i++) {
  27.         if (players[i].score >= cutoff) {
  28.             count++;
  29.         }
  30.     }
  31.     cout << cutoff << " " << count << endl;
  32.     for (int i = 0; i < count; i++) {
  33.         cout << players[i].id << " " << players[i].score << endl;
  34.     }
  35.     return 0;
  36. }
复制代码

希望以上内容能够帮助到你,如果有任何疑问,请随时提出。

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-29 22:08:58 | 显示全部楼层
题目地址?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-29 22:11:57 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-29 23:15:33 | 显示全部楼层    本楼为最佳答案   
代码如下
  1. #include<iostream>
  2. #include<math.h>
  3. using namespace std;
  4. int a[50010][3];
  5. int main()
  6. {
  7.         double m ;
  8.         int n,xian;
  9.         int count = 0;
  10.         cin>>n>>m;
  11.         for (int i = 1;i<=n;i++)
  12.         {
  13.         cin>>a[i][1];
  14.         cin>>a[i][2];
  15.         }
  16.         for (int j = n;j>=1;j--)
  17.         {
  18.        
  19.                 for (int i = 1;i<j;i++)
  20.                 {
  21.                         if (a[i][2] < a[i+1][2] || (a[i][2] == a[i+1][2] && a[i][1] > a[i+1][1]))
  22.                         {
  23.                                 swap(a[i],a[i+1]);
  24.                         }
  25.                 }
  26.         }
  27.         m = m/2 * 3;
  28.         m = floor(m);
  29.         xian = a[(int)m][2];
  30.         cout<<xian<<" ";
  31.         for (int i = 1;i<=n;i++)
  32.         {
  33.                 if (xian <= a[i][2])
  34.                 {
  35.                         count ++;
  36.                 }
  37.         }
  38.         cout<<count<<endl;
  39.         for (int i = 1;i<=count;i++)
  40.         {
  41.                 cout<<a[i][1]<<" "<<a[i][2]<<endl;
  42.         }
  43.        
  44. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-29 23:16:43 | 显示全部楼层
捕获.PNG
可AC
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-31 19:32:36 | 显示全部楼层
给个最佳好不好
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-10 00:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表