鱼C论坛

 找回密码
 立即注册
查看: 1389|回复: 2

[已解决]问题出在哪里了啊

[复制链接]
发表于 2023-11-4 21:11:35 | 显示全部楼层 |阅读模式

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

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

x
题目描述
达米奇同学的学校组织信息学竞赛模拟,发现了成绩并列如何排名是个难题。例如有四名选手的成绩分别为 50、80、50、30 分,则 80 分的选手为第一名,50 分的两名选手均为第二名,30 分的选手为第四名。老师请达米奇同学编写一个程序,计算一个选手在这种排名方式之下的名次(分数高的选手排前面)。

输入描述
第一行:一个整数 n
,表示参赛的选手数;

第二行:n
个整数,表示每位选手的成绩,两数之间用一个空格隔开;

第三行:一个整数,表示要查询名次的选手的成绩。

输出描述
一行:一个整数,表示该选手的名次。
对于 30%的数据,N≤100

对于 60%的数据,N≤1000

对于 100%的数据,N≤10000

对于 100%的数据,每名选手的分数范围为 0-100。
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int main()
  4. {
  5.     int n;int a[1001][2];int i,j,k,t,x;
  6.     cin>>n;
  7.     for(i=0;i<n;i++)
  8.     {
  9.         cin>>a[i][0];
  10.         a[i][1]=i+1;
  11.     }
  12.     for(i=0;i<n-1;i++)
  13.     {
  14.         for(j=0;j<n-1-i;j++)
  15.         {
  16.             if(a[j][0]<a[j+1][0])
  17.             {
  18.                 t=a[j][0];a[j][0]=a[j+1][0];a[j+1][0]=t;
  19.                 t=a[j][1];a[j][1]=a[j+1][1];a[j+1][1]=t;
  20.             }
  21.         }
  22.     }
  23.     for(i=1;i<n;i++)
  24.     {
  25.         if(a[i][0]==a[i-1][0])
  26.         {
  27.             a[i][1]=a[i-1][1];
  28.         }
  29.     }
  30.     cin>>x;
  31.     for(i=0;i<n;i++)
  32.     {
  33.         if(a[i][0]==x){cout<<a[i][1];break;}
  34.     }
  35. }
复制代码
最佳答案
2023-11-4 21:11:45
问题出在代码的第一行,应该是  #include<iostream>  而不是  #include<bits/stdc++.h> 。这是因为  #include<bits/stdc++.h>  是一个非标准的头文件,它包含了所有标准库的头文件,但在某些编译器中可能不被支持。

此外,代码中存在一些不必要的部分。以下是修正后的代码:

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5.     int n;
  6.     int a[10001][2];
  7.     int i, j, t, x;
  8.     cin >> n;
  9.     for (i = 0; i < n; i++)
  10.     {
  11.         cin >> a[ i][0];
  12.         a[ i][1] = i + 1;
  13.     }
  14.     for (i = 0; i < n - 1; i++)
  15.     {
  16.         for (j = 0; j < n - 1 - i; j++)
  17.         {
  18.             if (a[j][0] < a[j + 1][0])
  19.             {
  20.                 t = a[j][0];
  21.                 a[j][0] = a[j + 1][0];
  22.                 a[j + 1][0] = t;
  23.                 t = a[j][1];
  24.                 a[j][1] = a[j + 1][1];
  25.                 a[j + 1][1] = t;
  26.             }
  27.         }
  28.     }
  29.     for (i = 1; i < n; i++)
  30.     {
  31.         if (a[ i][0] == a[i - 1][0])
  32.         {
  33.             a[ i][1] = a[i - 1][1];
  34.         }
  35.     }
  36.     cin >> x;
  37.     for (i = 0; i < n; i++)
  38.     {
  39.         if (a[ i][0] == x)
  40.         {
  41.             cout << a[ i][1];
  42.             break;
  43.         }
  44.     }
  45. }
复制代码


修正后的代码将正确地计算选手的名次。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-11-4 21:11:45 | 显示全部楼层    本楼为最佳答案   
问题出在代码的第一行,应该是  #include<iostream>  而不是  #include<bits/stdc++.h> 。这是因为  #include<bits/stdc++.h>  是一个非标准的头文件,它包含了所有标准库的头文件,但在某些编译器中可能不被支持。

此外,代码中存在一些不必要的部分。以下是修正后的代码:

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5.     int n;
  6.     int a[10001][2];
  7.     int i, j, t, x;
  8.     cin >> n;
  9.     for (i = 0; i < n; i++)
  10.     {
  11.         cin >> a[ i][0];
  12.         a[ i][1] = i + 1;
  13.     }
  14.     for (i = 0; i < n - 1; i++)
  15.     {
  16.         for (j = 0; j < n - 1 - i; j++)
  17.         {
  18.             if (a[j][0] < a[j + 1][0])
  19.             {
  20.                 t = a[j][0];
  21.                 a[j][0] = a[j + 1][0];
  22.                 a[j + 1][0] = t;
  23.                 t = a[j][1];
  24.                 a[j][1] = a[j + 1][1];
  25.                 a[j + 1][1] = t;
  26.             }
  27.         }
  28.     }
  29.     for (i = 1; i < n; i++)
  30.     {
  31.         if (a[ i][0] == a[i - 1][0])
  32.         {
  33.             a[ i][1] = a[i - 1][1];
  34.         }
  35.     }
  36.     cin >> x;
  37.     for (i = 0; i < n; i++)
  38.     {
  39.         if (a[ i][0] == x)
  40.         {
  41.             cout << a[ i][1];
  42.             break;
  43.         }
  44.     }
  45. }
复制代码


修正后的代码将正确地计算选手的名次。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-4 21:13:09 | 显示全部楼层
这段代码的问题在于,它使用了冒泡排序来对分数进行排序,并且在排序的同时记录了每个选手的编号。但是,这种排序算法的时间复杂度较高,对于数量较大的选手,会导致程序运行缓慢。

此外,代码还存在几个小问题:

1. 变量 a 的第二维大小应该为 n 而不是 1001,否则会导致数组越界;
2. 在输入选手分数时,可以和编号一起读入,并用 pair 存储,这样可以简化代码并避免对数组进行排序时出现编号与分数不匹配的问题;
3. 在查找特定分数的选手名次时,可以使用二分查找算法,这样可以进一步提高程序的效率。

下面给出一个修改后的代码示例:
  1. ++
  2. #include <iostream>
  3. #include <algorithm>
  4. using namespace std;
  5. int main() {
  6.     int n, x;
  7.     cin >> n;
  8.     // 读入选手分数和编号
  9.     pair<int, int> a[n];
  10.     for(int i = 0; i < n; i++) {
  11.         cin >> a[i].first;
  12.         a[i].second = i + 1;
  13.     }
  14.     // 按照分数从高到低排序
  15.     sort(a, a+n, greater<pair<int, int>>());
  16.     // 处理分数相同的选手
  17.     for(int i = 1; i < n; i++) {
  18.         if(a[i].first == a[i-1].first) {
  19.             a[i].second = a[i-1].second;
  20.         }
  21.     }
  22.     // 二分查找特定分数的选手名次
  23.     cin >> x;
  24.     int l = 0, r = n-1;
  25.     while(l < r) {
  26.         int mid = (l + r) / 2;
  27.         if(a[mid].first >= x) {
  28.             l = mid + 1;
  29.         } else {
  30.             r = mid;
  31.         }
  32.     }
  33.     cout << a[l].second << endl;
  34.     return 0;
  35. }
复制代码

这个修改后的代码可以更快地处理大量选手,并且在处理分数相同的选手和查找特定分数的选手名次时,可以避免对数组进行排序。同时,它使用了现代 C++ 的一些语言特性,比如 pair、sort 和 greater,可以使代码更加简洁和易读。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-21 14:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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