这是我的解决方案:
#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;
}
这个程序给了我 TLE(超出时间限制)错误,因此我从100中只得到30分。具体来说,这个程序无法完成子任务-2 值得其余70分(在问题页面上给出)。
我尝试过使用 printf 和 scanf 而不是 cin 和 cout ,但程序仍然不够快。
我可以做些什么来改进这个程序,或者解决这个问题的更好方法是什么。
我也试过这个,但得到了同样的错误:
#include <iostream>
using namespace std;
int main(){
long numberOfGums;
long hardnessLimit;
long counter = 0;
long temp = 0;
cin >> numberOfGums;
cin >> hardnessLimit;
long gums[numberOfGums];
for(long i=0; i<numberOfGums; i++){
cin >> temp;
if(temp < hardnessLimit){
gums[i] = temp;
}
}
for(long i=0; i<numberOfGums; i++){
if(gums[i] != -1){
for(long j=i+1; (j<numberOfGums); j++){
if(((gums[i] + gums[j]) < hardnessLimit) && gums[j] != -1){
counter++;
}
}
}
}
cout << counter << endl;
return 0;
}
答案 0 :(得分:1)
您的解决方案是O(N^2)
,鉴于约束条件肯定会超时。
更有效的解决方案是O(NlogN)
解决方案。这是算法的基本概要:
对数组进行排序。这需要O(NlogN)
时间。
现在对于排序数组中的每个元素,比如p
,在数组中搜索元素索引(元素p
的右侧),使得该索引处的值更小比k - p
。使用二进制搜索。找到此索引后,您可以轻松计算与元素p
关联的此类对的数量。完整步骤每个元素花费O(logN)
次
对于除最后一个元素之外的数组中的所有元素执行上述过程,因为右侧没有数组。
您将通过总结已获得的每个元素p
的所有对来得到答案
希望它有所帮助!!!
编辑:我正在添加上述算法的C ++实现。此解决方案通过CodeChef上的所有测试用例。
#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;
}
答案 1 :(得分:-1)
TLE(Time Limit Exceeded) 发生在您的程序未在规定时间内完全运行时。 在竞争性编程中,出现 TLE 是因为程序花费的时间超过输出的时间限制。