#include <bits/stdc++.h>
using namespace std;
int main()
{
	int n,a,b,m,x;
	cin>>n>>a;
	for(int i=2;i<=n;i++)
	{
	 cin>>b;
	 if(a<b) m=b;//求最大值 
	 if(a>b) x=a;//求最小值 
	 return 0;
		
	}
	cout<<m-x;
	
	
	
	
	
	
	
	return 0;
}

6 comments

  • @ 2026-9-27 15:34:00

    这位同学你好,我是信息竞赛教练。看到你已经收到了几位同学的回复,思路方向基本是对的。不过作为教练,我不直接给你能跑的完整代码,而是帮你把逻辑漏洞逐个指出来,你自己改一遍,印象会更深。

    先看你的代码问题出在哪

    问题 1:return 0 的位置错了(最致命)

    for(int i=2;i<=n;i++)
    {
        cin>>b;
        if(a<b) m=b;
        if(a>b) x=a;
        return 0;   // ← 这里!
    }
    

    return 0 写在循环体内部,意味着第一次循环就结束了整个程序。后面的 cout<<m-x 根本没机会执行。这是你“没有输出”的直接原因。想一想:return 应该放在哪个位置,程序才能把 n 个数全部读完再输出?

    问题 2:m 和 x 没有初始化 int m, x; 声明之后是随机值(未定义行为)。即使循环跑完了,m - x 也可能是垃圾数据。你应该给它们一个合理的初值——比如把 m 设成一个“比所有可能值都小”的数,x 设成一个“比所有可能值都大”的数。结合数据范围(正整数 < 1000),你觉得初值取多少合适?

    问题 3:比较逻辑不完整

    if(a<b) m=b;
    if(a>b) x=a;
    

    你始终拿第一个数 a 去和当前数 b 比,而且只在 a<b 或 a>b 时才更新。问题在于:

    • 如果出现了比当前最大值更大的数,你更新了;但如果后面又来了更大的,你还在和 a 比,就漏掉了。
    • 正确做法是:每次都拿“当前已知的最大值”和“当前读入的数”比较,而不是固定拿 a 比。

    正确的思考框架

    设两个变量 maxx、minn,表示“到目前为止见过的最大值和最小值”。

    1. 初始化:maxx 取一个足够小的值,minn 取一个足够大的值。
    2. 循环读入每个数 x:
      • 如果 x > maxx,则 maxx = x;
      • 如果 x < minn,则 minn = x。
    3. 循环结束后输出 maxx - minn。

    这样每个数只被处理一次,时间复杂度 O(n)O(n),完全够用(n≤1000n \le 1000)。

    关于其他同学的回复,我提醒你两点

    • 有同学说“用 long long”。本题数据范围很小(< 1000),int 完全够,但养成看数据范围选类型的习惯是好事。
    • 有同学给的代码里 m = -1, x = 0x3f3f3f3f 是一种常见初值技巧。你要理解为什么这么取:-1 保证任何正整数都会大于它;0x3f3f3f3f 是一个很大的数,保证任何正整数都会小于它。

    留给你自己动手的检查清单

    1. return 0 挪到循环外,且只保留最后那一个。
    2. maxx、minn 给出合理初值。
    3. 比较对象改成 maxx/minn 本身,而不是固定的 a。
    4. 想一想:如果所有数都相等(比如样例里的 5 个 1),你的程序还能输出 0 吗?

    改完再跑一遍样例 1 1 4 5 1,看看是不是输出 4。有新的问题欢迎继续贴出来讨论。

    • @ 2026-9-27 15:33:54

      你得定义一下初始的最大值和最小值

      • @ 2023-10-22 11:46:45

        不能用第一个输入的数比较。 在中间return 0; 程序就结束了,没有输出。

        #include <bits/stdc++.h>
        using namespace std;
        int n,a,b,m = -1,x = 0x3f3f3f3f;
        
        int main()
        {
        
        	cin>>n;
        	for(int i=1;i<=n;i++)
        	{
        	 cin>>b;
        	 if(b>m) m=b;//求最大值 
        	 if(b<x) x=b;//求最小值 
        	 //return 0;
        		
        	}
        	cout<<m-x;
        	return 0;
        }
        
        • @ 2023-10-22 10:47:50

          如果你那这个,很难改

          #include <bits/stdc++.h> using namespace std;

          int main(){ long long n,x,maxx=-1,minn=1001; cin>>n; for(int i=1;i<=n;i++){ cin>>x; if(maxx<x){ maxx=x; } if(minn>x){ minn=x; } } cout<<maxx-minn; }

          • @ 2023-10-22 10:45:58

            i定义成一

            • @ 2023-10-22 10:44:16

              拿longlong写

              • 1

              Information

              ID
              569
              Time
              1000ms
              Memory
              256MiB
              Difficulty
              2
              Tags
              # Submissions
              340
              Accepted
              217
              Uploaded By