C++ 减少C+中的运行时间+;

C++ 减少C+中的运行时间+;,c++,optimization,C++,Optimization,最近,由TCS组织的CodeVita第九季在世界各地播出。下面给出了一个问题陈述 问题描述: 给定一个整数数组A和一个整数K,可以找到快乐元素的数量 如果至少存在一个元素的差值小于K,那么元素X是快乐的,即,如果[X-K,X+K]范围内除了X本身之外还有另一个元素,那么元素X是快乐的 约束 1=0&&a[i]您可以利用标准库中非常高效的工具。 如果将值存储在std::vector中,则可以使用std::sort对值进行排序。 然后在向量上迭代,查看两个连续元素之间的差异 因为标准库算法是高效的,

最近,由TCS组织的CodeVita第九季在世界各地播出。下面给出了一个问题陈述

问题描述:

给定一个整数数组A和一个整数K,可以找到快乐元素的数量

如果至少存在一个元素的差值小于K,那么元素X是快乐的,即,如果[X-K,X+K]范围内除了X本身之外还有另一个元素,那么元素X是快乐的

约束


1=0&&a[i]您可以利用标准库中非常高效的工具。 如果将值存储在std::vector中,则可以使用std::sort对值进行排序。 然后在向量上迭代,查看两个连续元素之间的差异

因为标准库算法是高效的,所以它将更加高效。排序平均可能低至O(n logn),最终搜索为O(n)


你的搜索循环是O(n2),这更糟糕。

如果它目前是某些竞争的一部分,你最好自己尝试解决它。如果你问比赛后出了什么问题会更好。
pow(10,5)
pow(10,9)
可能很贵。一个好的编译器会注意到这些值永远不会改变,并用常量替换它们,但是…
inta[siz]在标准C++中是不合法的。其中一个原因是,用户大小的可变长度数组可以满足所有堆栈溢出需求。在一个时间限制很紧的在线法官问题中,这通常是死亡之吻。集中精力寻找可以用来减少必须执行的工作量的模式。保持类型为
std::map
的运行哈希表,该哈希表表示任何整数的出现次数。地图中的第一个元素是下限,第二个元素是上限。扫描阵列时,从映射中删除元素
a[i-K]
,并将元素
a[i+K]
添加到映射中。
#include<iostream>
#include<math.h>
using namespace std;
int main(){
    int siz, x;
    cin>>siz;
    cin>>x;
    if(siz>= 1 && siz<= pow(10, 5) && x>=0 && x<= pow(10, 5)){
        int a[siz];
        for(int i=0; i<siz; i++){
            cin>>a[i];
            if(a[i]>=0 && a[i]<= pow(10, 9))
                continue;
            else
                break;
        }
        int cnt, op = 0, i = 0;
        while(i<siz){
            cnt = 0;
            int dif1 = a[i] - x;
            int dif2 = a[i] + x;
            for(int j=0; j<siz; j++){
                if(a[j]>= dif1 && a[j] <= dif2){
                    if(a[j] != a[i])
                        cnt=1;
                }
            }
            if(cnt == 1)
                ++op;
            i++;
        }
        cout<<op;
    }
    return 0;
}