```
#include<bits/stdc++.h>
using namespace std;
int a[100000005],n,f,ans;
int main()
{
cin>>n>>f;
for(int i=1;i<=n;i++)
cin>>a[i];
ans=0;
sort(a+1,a+n+1);
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++){
if(a[j]-a[i]>f)
break;
ans++;
}
cout<<ans;
return 0;
}
```
这样子试试?
by 失之_连心 @ 2018-08-13 23:16:17
@[mzyc99881791](/space/show?uid=91716) 您应该先给数据进行一下排序。即在输入结束后加上这么一句:`sort(a,a+n);`注意需要`#include<algorithm>`
但您会发现,这么做会 TLE。需要进行一步优化:在 `x++` 后面加上一句:`else break;` 因为已经排过序,所以这种情况一定不会符合题意,可以直接跳出循环。
就是这样。改后代码如下:
```cpp
#include<iostream>
#include<algorithm> // 新加
using namespace std;
int a[100001];
int main() {
int n,d,i,j,x=0;
cin>>n>>d;
for(i=0;i<n;i++)
{
cin>>a[i];
}
std::sort(a,a+n); // 新加
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(a[i]+d>=a[j]) x++;
else break; // 新加
}
}
cout<<x;
return 0;
}
```
by Anguei @ 2018-08-14 02:33:11
@[Anguei](/space/show?uid=53062) 非常感谢您,这是我的代码,
#include <cstdio>
#define SM 402600
int a[SM] , n , d , ans ;
int swap ( int &a , int &b ) {
int c = a ; a = b , b = c ;
}
int qsort ( int l , int r ) {
if ( l >= r ) return 0 ;
int mid = a[ l + r >> 1 ] , i = l , j = r ;
while ( i <= j ) {
while ( a[i] < mid ) i ++ ;
while ( a[j] > mid ) j -- ;
if ( i <= j ) {
swap ( a[i] , a[j] ) ;
i ++ , j -- ;
}
}
if ( l , j ) qsort ( l , j ) ;
if ( i , r ) qsort ( i , r ) ;
}
int main ( ) {
scanf ( "%d%d" , &n , &d ) ;
for ( int i = 1 ; i <= n ; i ++ ) scanf ( "%d" , a + i ) ;
qsort ( 1 , n ) ;
for ( int i = 1 ; i <= n ; i ++ ) {
int x = a[i] + d ;
for ( int j = i + 1 ; j <= n ; j ++ )
if ( x >= a[j] )
ans ++ ;
else break ;
}
printf ( "%d" , ans ) ;
return 0 ;
}
不加 break , 会 TLE 两个点,后来加上后,就AC了,不过我还是想请问您,这里的break,结束的是哪个循环?是里面的小循环,还是外边的大循环?请大佬指教
by altar @ 2018-11-06 16:16:40
@[Youngore](/space/show?uid=58324) break 所在的最内层循环。
by Anguei @ 2018-11-06 16:23:14
@[Anguei](/space/show?uid=53062) 谢谢您
by altar @ 2018-11-06 16:30:02
@[Anguei](/space/show?uid=53062) 为什么要用berak for 循环里面有j<=n 啊
by LIRU123 @ 2019-07-15 20:55:33