为何36分

P1296 奶牛的耳语

``` #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


|