【发布时间】:2016-11-04 08:12:48
【问题描述】:
这是我的解决方案:
#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(Time Limit Exceeded) 错误,因此我在 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;
}
【问题讨论】:
-
因为这可能是一个可以优化的蛮力解决方案。当 numberOfGums 可以大到 100,000 时,您有一个 o(n^2) 复杂度解决方案。
-
你有什么更好的方法建议,对数组进行排序还是什么?
-
请去掉 C 标签,这绝不是有效的 C 代码
-
总是试着弄清楚你可以从输入数据的排序中获得什么。
-
@Virus 你为什么不认为对数组进行排序是行不通的?您发布的 O(n*n) 解决方案比排序和二进制搜索要慢得多。