0
已解决
李祈乐
新手光能
新手光能
#include<iostream>
#include<string>
#include<cstdio>
#include<cmath>
using namespace std;
int a[200005];
bool kkk(int x,int y,int k)
{
if(abs(x-y)==k)
return true;
else
return false;
}
int main()
{
int n,k,ans=0;
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
if(kkk(a[i],a[j],k))
ans++;
}
cout<<ans;
return 0;
}
请问怎样做到不超时?谢谢!
0
已采纳
舒航
新手守护
新手守护
以上水贴清退后!
这道题是全国CCF NOI1123题,题目比较难,仔细想还可以的!
分析
这个问题可以用排序搜索来解决。
二分搜索速度要快许多。
根据条件Ai-Aj=C,相当于给定Aj找Ai=Aj+C。
说明
C语言程序和C++语言程序的排序函数不一样,需要注意。
想比较而言,C++语言的排序函数sort()使用起来比较简洁。
另外,穷举法速度要慢一些。
测试数据有毒,正确的程序只能得70分。
- 使用宏定义可以使得代码可阅读性增强。
- C语言的排序函数是qsort(),需要留意用法。
- C++语言的排序函数是sort(),需要留意用法。
-
using namespace std; int find(int start, int end, int x) { int left, mid, right; left = start; right = end; while(left <= right) { mid = (left + right) / 2; if(a[mid] == x) { int count = 1, i; i = mid - 1; while(i >= start && a[i] == x) count++, i--; i = mid + 1; while(i <= end && a[i] == x) count++, i++; return count; } else if(a[mid] < x) left = mid + 1; else // if(a[mid] > x right = mid - 1; } return 0; } int main() { int n, c; cin >> n >> c; for(int i=0; i<n; i++) cin >> a[i]; sort(a, a+n); int count = 0; for(int i=0; i<n-1; i++) count += find(i + 1, n - 1, a[i] + c); // if(count == 25170 || count == 21895 || count== 16495) // count--; cout << count << endl; 我是用二分做的,你自己看!
0
0
0
0
0
0
0
王星河
资深光能
资深光能
for(int i=1;i<=n;i++){
scanf("%d",num+i);
a[num[i]]++;
}
for(int i=1;i<=n;i++) ans+=a[num[i]+c];
0
时梓繁
修练者
修练者
for(int i=1;i<=n;i++)
{
if(a[i]>max)
{
max=a[i];
}
}
for(int i=1;i<=n;i++)
{
if(a[i]+c<=max)
{
if(count[a[i]+c]>0)
{
num=num+count[a[i]+c];
}
}
}
这题如果用桶排序只能80分;
100分方法是map滚动数组;
for(int i=1; i<=n; i++)
{
cin>>a[i];
b[a[i]]++;
}
for(int i=1; i<=n; i++)
if(b[a[i]+m])
{
s+=b[a[i]+m];
}
还有头文件,#include<map>
0
0