我在解决问题上解决AMR10G问题。问题只是关于排序,并且使用数组实现是微不足道的。我是STL的初学者,只是为了熟悉STL,我试图用一些向量来解决它。代码运行良好,矢量小,但大尺寸(问题可能是20,000),它打印所有0。这是我的代码。
#include <iostream>
#include <vector>
#include <algorithm>
#include <stdio.h>
using namespace std;
int main() {
int T;
cin>>T;
while(T--){
int N, k, i;
cin>>N >> k;
//***********************************************************
vector<int> ar(N);//problem seems to be here when N ~ 20000
//***********************************************************
for(i = 0; i<N; i++) scanf("%d",&ar[i]);
sort(ar.begin(),ar.end());
//calculate smallest difference
int small = ar[k-1] - ar[0];
for(i = k-1; i<N; i++){
int temp;
if( temp = ar[i] - ar[i-k+1] < small) small = temp;
}
cout<<small <<endl;//print smallest difference
}
return 0;
}
当我将类型更改为数组时,它运行得非常好。使用矢量有什么问题?
答案 0 :(得分:1)
您的代码缺少错误检查:
arr2.values_at(*arr2.map { |str,_| arr1.index(str) })
#=> [["name1", 10], ["name2", 20], ["name3", 15]]
是否成功。 cin >> N >> k
是否成功。scanf
是否在数组范围的范围内。任何这些失败都可能导致您的问题。
此行还有一个逻辑错误:
k -1
控制表达式被解析为if( temp = ar[i] - ar[i-k+1] < small) small = temp;
,因此如果temp = (ar[i] - ar[i-k+1] < small)
,此行将设置small = 1
,否则不执行任何操作。你可能意味着ar[i] - ar[i-k+1] < small
。