我有N个整数Ai定义为A1,A2,...,AN。我必须处理形式的Q查询。对于每个这样的查询,找到索引i,使得Ai≥a。我必须尽量减少Ai-a的差异。我这样做了
while(q--)
{
cin>>a;
mini=INT_MAX;
index=-1;
for(int i=0;i<n;i++)
{
diff1=A[i]-a;
if(diff1>=0)
{
ll sum=diff1;
if(sum<mini)
{
mini=sum;
index=i+1;
}
if(mini==0)
break;
}
}
cout<<index;
}
但它会导致TLE。有效的方法是什么?
答案 0 :(得分:0)
您可以构建一对(Ai, i)
,一次排序,二次搜索Q
次。
#include <vector>
#include <algorithm>
#include <utility>
bool cmp1st(const std::pair<int, int>& lhs, const std::pair<int, int>& rhs)
{
return lhs.first < lhs.right;
}
std::pair<int, int> *values = new std::pair<int, int>[n];
// Build array of (Ai, i)
for (int i = 0; i < n; ++i) {
values[i] = std::make_pair(A[i], i);
}
// Sort by ascending order of Ai
std::sort(values, values + n);
while(q--)
{
cin>>a;
// binary search
int index = std::lower_bound(values, values + n, std::make_pair(a, 0), cmp1st)->second;
cout<<index;
}
delete [] values;