武林有个传承千年的传统,每隔十年,各门各派的武林高手会齐聚华山之巅,进行一番比武切磋。每名参加比武的高手都有一个武力值,代表他/她的武功水平,武力值越高代表武功越高。每场比武都是一对一的,为了体现公平,任何两名比武的对手的武力值之差不能超过一个阈值,不然高手一招就可能取了对方性命。现在把所有武林高手的武力值从小到大依次给出,请计算一共能安排多少场不同对手之间的比武。
一共两行,第 1 行包含两个整数 N, M,分别表示比武人数(1<=N<=106) 和 比武双方武力值之差的最大值(0<=M<=107)。
第 2 行包含 N 个正整数 Wi,表示每个人的武力值(1<=Wi<=107),保证是不降序列,可能有武力值相同的情况。
一个整数,表示一共能安排多少场不同的比武。
样例输入1
4 2
1 3 4 7
样例输入2
10 8
1 4 5 5 9 10 10 10 19 27
样例输出1
2
样例输出2
26
样例 1 的说明:只有 (1,3) 和 (3,4) 能安排比武,其余任何两人都不行。因此输出 2。
样例 2 的说明:可以安排的比武包括:(1,4), (1,5), (1,5), (1,9), (4,5), (4,5), (4,9), (4,10), (4,10), (4,10), (5,5), (5,9), (5,10), (5,10), (5,10), (5,9), (5,10), (5,10), (5,10), (9,10), (9,10), (9,10), (10,10), (10,10), (10,10), (19,27),一共26场。 但是,例如 (1,10) 或 (5,19) 不能安排比武,因为双方的差值大于 8;而 (1,4) 和 (4,1) 算作同一场比武;而 (4,5) 和 (4,5) 有两场是因为有两人的武力值为5,两场比武并不重复。
数据范围和约定: 对于 20% 的数据,N<=5000; 对于另外 10% 的数据,M=0; 对于另外 20% 的数据,1<=Wi<=100; 对于全部数据,1<=N<=106,0<=M<=107,1<=Wi<=107,并且 Wi 是不降序列(可能有相同值)。
我的代码
#include<iostream>
using namespace std;
long long int a[1000000],n,m,ans;
int main()
{
cin >> n >> m;
for(int i=0;i<n;i++){
cin >> a[i];
}
for(int i=0;i<n/2;i++){
for(int j=0;j<n;j++){
if(a[i]>a[j]){
if(a[i]-a[j]>m){
continue;
}
else{
ans++;
//cout << "(" << a[i] << "," << a[j] << ")";
}
}
if(a[i]==a[j]&&i!=j){
ans++;
//cout << "(" << a[i] << "," << a[j] << ")";
}
if(a[i]<a[j]){
if(a[j]-a[i]>m){
continue;
}
else{
ans++;
//cout << "(" << a[i] << "," << a[j] << ")";
}
}
}
}
cout << ans;
}
注释是用来测试的,不用管