C++ CodeChef上的时间限制错误

C++ CodeChef上的时间限制错误,c++,algorithm,C++,Algorithm,以下是我的解决方案: #include <iostream> using namespace std; int main(){ unsigned long numberOfGums; unsigned long hardnessLimit; unsigned long counter = 0; cin >> numberOfGums; cin >> hardnessLimit; unsigned long

以下是我的解决方案:

#include <iostream>

using namespace std;

int main(){
    unsigned long numberOfGums;
    unsigned long hardnessLimit;
    unsigned long counter = 0;

    cin >> numberOfGums;
    cin >> hardnessLimit;

    unsigned long gums[numberOfGums];

    for(unsigned long i=0; i<numberOfGums; i++){
        cin >> gums[i];
    }

    for(unsigned long i=0; i<numberOfGums; i++){
        if(gums[i] < hardnessLimit){
            for(unsigned long j=i+1; j<numberOfGums; j++){
                if((gums[i] + gums[j]) < hardnessLimit){
                    counter++;
                }
            }
        }
    }

    cout << counter << endl;

    return 0;
}
#包括
使用名称空间std;
int main(){
未签名的长数牙龈;
无符号长硬度极限;
无符号长计数器=0;
cin>>牙龈数;
cin>>硬度极限;
无符号长齿龈[齿龈数];
对于(无符号长i=0;i>gums[i];
}
对于(无符号长i=0;i您的解决方案是
O(N^2)
,在给定约束的情况下,它肯定会超时

更有效的解决方案是
O(NlogN)
解决方案。这是该算法的基本概述:

  • 对数组进行排序。这需要
    O(NlogN)
    时间

  • 现在,对于排序数组中的每个元素,例如
    p
    ,搜索元素索引(元素
    p
    的右侧)在数组中,使该索引处的值小于
    k-p
    。对此使用二进制搜索。找到此索引后,您可以轻松计算与元素
    p
    关联的此类对的数量。此完整步骤需要每个元素的
    O(logN)
    时间

  • 对数组中除最后一个元素外的所有元素执行上述过程,因为其右侧没有数组

通过将您获得的每个元素
p
的所有对相加,您将得到答案

希望对你有帮助

<强>编辑:我添加了上述算法的C++实现。

#include <iostream>
#include <algorithm>
using namespace std;
int binsearch(int a[],int n, int x)
{
    int low, high, mid, k=-1;
    low = 0;
    high = n-1;
    while(low<=high)
    {
        mid = (low+high)/2;
        if(a[mid] <= x-1){
            k = mid;
            low = mid+1;
        }
        else{
            high = mid-1;
        }

    }
    return k;
}
int main() 
{
    int n, k, i, j;
    long long ans = 0;
    cin>>n>>k;
    int arr[n];

    for(i=0;i<n;i++)
    {
        cin>>arr[i];
    }

    sort(arr,arr+n);

    j = 0;

    while(j<n-1)
    {
        if(k-arr[j] > 0)
        {
            int ind = binsearch(arr,n,k-arr[j]);
            ans = ans + (ind-j>=0 ? (ind-j):0);
        }
        j++;
    }
    cout<<ans<<endl;
    return 0;

}
#包括
#包括
使用名称空间std;
int-bin搜索(int a[],int n,int x)
{
int低、高、中,k=-1;
低=0;
高=n-1;
而(低>>k;
int-arr[n];
对于(i=0;i>arr[i];
}
排序(arr,arr+n);
j=0;
while(j0)
{
int ind=b搜索(arr,n,k-arr[j]);
ans=ans+(ind-j>=0?(ind-j):0);
}
j++;
}
cout您的解决方案是
O(N^2)
,在给定约束的情况下,它肯定会超时

更有效的解决方案是
O(NlogN)
解决方案。这是该算法的基本概述:

  • 对数组进行排序。这需要
    O(NlogN)
    时间

  • 现在,对于排序数组中的每个元素,例如
    p
    ,搜索元素索引(元素
    p
    的右侧)在数组中,使该索引处的值小于
    k-p
    。对此使用二进制搜索。找到此索引后,您可以轻松计算与元素
    p
    关联的此类对的数量。此完整步骤需要每个元素的
    O(logN)
    时间

  • 对数组中除最后一个元素外的所有元素执行上述过程,因为其右侧没有数组

通过将您获得的每个元素
p
的所有对相加,您将得到答案

希望对你有帮助

<强>编辑:我添加了上述算法的C++实现。

#include <iostream>
#include <algorithm>
using namespace std;
int binsearch(int a[],int n, int x)
{
    int low, high, mid, k=-1;
    low = 0;
    high = n-1;
    while(low<=high)
    {
        mid = (low+high)/2;
        if(a[mid] <= x-1){
            k = mid;
            low = mid+1;
        }
        else{
            high = mid-1;
        }

    }
    return k;
}
int main() 
{
    int n, k, i, j;
    long long ans = 0;
    cin>>n>>k;
    int arr[n];

    for(i=0;i<n;i++)
    {
        cin>>arr[i];
    }

    sort(arr,arr+n);

    j = 0;

    while(j<n-1)
    {
        if(k-arr[j] > 0)
        {
            int ind = binsearch(arr,n,k-arr[j]);
            ans = ans + (ind-j>=0 ? (ind-j):0);
        }
        j++;
    }
    cout<<ans<<endl;
    return 0;

}
#包括
#包括
使用名称空间std;
int-bin搜索(int a[],int n,int x)
{
int低、高、中,k=-1;
低=0;
高=n-1;
而(低>>k;
int-arr[n];
对于(i=0;i>arr[i];
}
排序(arr,arr+n);
j=0;
while(j0)
{
int ind=b搜索(arr,n,k-arr[j]);
ans=ans+(ind-j>=0?(ind-j):0);
}
j++;
}
coutTLE(超过时间限制)当您的程序未在时间内完全运行时发生。
在竞争性编程中,TLE发生的原因是程序所用的时间超过了输出的时间限制。

TLE(超出时间限制)发生在程序未在时间内完全运行时。
在竞争性编程中,TLE的出现是因为该程序比输出的时间限制花费更多的时间。

因为这可能是一个可以优化的蛮力解决方案。您有一个o(n^2)复杂度解决方案当numberOfGum可以大到100000时。你建议什么更好的方法,排序数组还是什么?请删除C标记,这绝不是有效的C代码总是试图找出从排序输入数据中可以得到什么。@病毒为什么你不认为排序数组不起作用?一个O(n*n)您发布的解决方案比排序和二进制搜索慢得多。因为这可能是一个可以优化的蛮力解决方案。您有一个o(n^2)复杂度解决方案当numberOfGum可以大到100000时。你建议什么更好的方法,排序数组还是什么?请删除C标记,这绝不是有效的C代码总是试图找出从排序输入数据中可以得到什么。@病毒为什么你不认为排序数组不起作用?一个O(n*n)你发布的解决方案要比排序慢,然后二进制搜索慢。如果你使用的是C++之类的东西,它不是C++。<代码> >这是无效的C++。有时堆栈的溢出会导致错误。应该将其改为<代码> STD::向量,也可以使用“代码> STD::LoWiLuxBuffy/Cuth>代替编写自己的二进制搜索。”PulcMcKeZie:我不是C++中的PRO。我更喜欢在C++中使用C类语法来解决竞争性的编码问题。看看作者的代码,很可能他对向量没有太多的了解。所以我试图从语法的角度尽量保持这个解决方案。@ MRSMIT42仍然是有效的C++代码——不,它不是。可变长度数组从来都不是有效的C++代码,它误导代码说C++是正确的。它与问题非常相关,因为存在这样的问题:使用数组是问题的原因(堆栈内存问题和SEG故障),其中STD::向量的使用解决了问题。如图所示,代码无法使用Visual Studio 2015编译。如果使用“<代码>”,则不是C++。