站外题求助
  • 板块题目总版
  • 楼主liuhaoyan11
  • 当前回复10
  • 已保存回复10
  • 发布时间2023/1/4 06:22
  • 上次更新2023/10/24 05:38:48
查看原帖
站外题求助
866576
liuhaoyan11楼主2023/1/4 06:22

描述

武林有个传承千年的传统,每隔十年,各门各派的武林高手会齐聚华山之巅,进行一番比武切磋。每名参加比武的高手都有一个武力值,代表他/她的武功水平,武力值越高代表武功越高。每场比武都是一对一的,为了体现公平,任何两名比武的对手的武力值之差不能超过一个阈值,不然高手一招就可能取了对方性命。现在把所有武林高手的武力值从小到大依次给出,请计算一共能安排多少场不同对手之间的比武。

输入

一共两行,第 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;
}

注释是用来测试的,不用管

2023/1/4 06:22
加载中...