传智杯 第六届—B

题目:

        擂台赛要开始了,现在有 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值