初莫M 发表于 2023-11-4 21:11:35

问题出在哪里了啊

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

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

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

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

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

对于 60%的数据,N≤1000

对于 100%的数据,N≤10000

对于 100%的数据,每名选手的分数范围为 0-100。
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;int a;int i,j,k,t,x;
    cin>>n;
    for(i=0;i<n;i++)
    {
      cin>>a;
      a=i+1;
    }
    for(i=0;i<n-1;i++)
    {
      for(j=0;j<n-1-i;j++)
      {
            if(a<a)
            {
                t=a;a=a;a=t;
                t=a;a=a;a=t;
            }
      }
    }
    for(i=1;i<n;i++)
    {
      if(a==a)
      {
            a=a;
      }
    }
    cin>>x;
    for(i=0;i<n;i++)
    {
      if(a==x){cout<<a;break;}
    }
}

isdkz 发表于 2023-11-4 21:11:45

问题出在代码的第一行,应该是#include<iostream>而不是#include<bits/stdc++.h> 。这是因为#include<bits/stdc++.h>是一个非标准的头文件,它包含了所有标准库的头文件,但在某些编译器中可能不被支持。

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

#include<iostream>
using namespace std;
int main()
{
    int n;
    int a;
    int i, j, t, x;
    cin >> n;
    for (i = 0; i < n; i++)
    {
      cin >> a[ i];
      a[ i] = i + 1;
    }
    for (i = 0; i < n - 1; i++)
    {
      for (j = 0; j < n - 1 - i; j++)
      {
            if (a < a)
            {
                t = a;
                a = a;
                a = t;
                t = a;
                a = a;
                a = t;
            }
      }
    }
    for (i = 1; i < n; i++)
    {
      if (a[ i] == a)
      {
            a[ i] = a;
      }
    }
    cin >> x;
    for (i = 0; i < n; i++)
    {
      if (a[ i] == x)
      {
            cout << a[ i];
            break;
      }
    }
}


修正后的代码将正确地计算选手的名次。

Mike_python小 发表于 2023-11-4 21:13:09

这段代码的问题在于,它使用了冒泡排序来对分数进行排序,并且在排序的同时记录了每个选手的编号。但是,这种排序算法的时间复杂度较高,对于数量较大的选手,会导致程序运行缓慢。

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

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

下面给出一个修改后的代码示例:

++
#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    int n, x;
    cin >> n;

    // 读入选手分数和编号
    pair<int, int> a;
    for(int i = 0; i < n; i++) {
      cin >> a.first;
      a.second = i + 1;
    }

    // 按照分数从高到低排序
    sort(a, a+n, greater<pair<int, int>>());

    // 处理分数相同的选手
    for(int i = 1; i < n; i++) {
      if(a.first == a.first) {
            a.second = a.second;
      }
    }

    // 二分查找特定分数的选手名次
    cin >> x;
    int l = 0, r = n-1;
    while(l < r) {
      int mid = (l + r) / 2;
      if(a.first >= x) {
            l = mid + 1;
      } else {
            r = mid;
      }
    }
    cout << a.second << endl;

    return 0;
}


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

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 问题出在哪里了啊