首页 > 其他分享 >传智杯 第六届—B

传智杯 第六届—B

时间:2024-10-10 11:18:40浏览次数:3  
标签:sort 战士 传智杯 正整数 战斗力 int 第六届 比较

题目:

        擂台赛要开始了,现在有 n 名战士,其中第 i 名战士的战斗力为 ai​。现在准备从这些战士中挑两名战士进入擂台赛进行对战,由于观众们更喜欢看势均力敌的比赛,所以我们也要挑选两个战斗力尽可能相近的战士进行参赛。那么现在请问,战斗力最接近的两名战士,战斗力之差为多少?

输入描述:

        第一行输入一行一个正整数 n 表示战士的数量。

        第二行输入 n个正整数表示每名战士的战斗力。(1≤n≤10^5,1≤ai≤10^9)

输出描述:

        输出一行一个正整数表示答案。

示例1

输入:

3
3 5 5

输出:

0

说明:

        选择两名战斗力为 5 的战士,战斗力之差为 0。

解题思路:

        本题是想要找出战斗力最小的差,所以需要先将每个战士的战斗力记录下来,我们将每个战士i的战斗力存储在数组下标为i的数组中,并通过两个比较(两次for循环显示超时,所以采用先排序后比较的方法)来得到最小的战斗力差,并存储在min_combat中。

注意:

        ①由于需要注意时间,如果在两两对比的时候使用两个for循环来进行比较,就会出现运行超时的情况,对这个问题的解决方法是先利用sort函数进行排序(详见C++算法:sort()函数_c++ sort函数-CSDN博客),再进行比较即可。

代码:

#include<iostream>
#include<algorithm>
using namespace std;
#define MAX1 100000
#define MAX2 1000000000


int main()
{
    int num;    //战士的个数
    cin>>num;
	int soldier[MAX1] = {0};
    for(int i=0;i<num;i++)
    {
        cin>>soldier[i];
    }
    
    //比较战斗力
    int min_combat = MAX2;
    利用两个for循环进行两两比较
    //for(int i=0;i<num-1;i++)
    //{
    //    for(int j=i+1;j<num;j++)
    //    {
    //        int compute_combat = soldier[i] - soldier[j];
    //        if(compute_combat < 0)   //为正
    //        {
    //            compute_combat = -compute_combat;
    //        }
    //        //保存战斗力更小的数
    //        min_combat = min_combat < compute_combat?min_combat:compute_combat;
    //    }
    //}

	//先排序,再与相邻的数进行比较
	sort(soldier,soldier+num);

	//比较
	for(int i=0;i<num-1;i++)
	{
		int compute_combat = soldier[i] - soldier[i+1];
        if(compute_combat < 0)   //为正
        {
			compute_combat = -compute_combat;
        }
		min_combat = min_combat < compute_combat?min_combat:compute_combat;
	}
    cout<<min_combat<<endl;
    
    system("pause");
    return 0;
}

标签:sort,战士,传智杯,正整数,战斗力,int,第六届,比较
From: https://blog.csdn.net/weixin_66512566/article/details/142783662

相关文章