问题标题: 酷町堂:1772 A - B = C 80分超时

0
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
王浩然
王浩然
新手光能
新手光能

高精度的够了,明明是用map滚动数组做

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
我要回答