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