以下代码在Visual Studio 2012和c ++ 11中生成不同的输出。
问题:
http://www.codechef.com/FEB14/problems/SUBMIN
Little Elephant正在玩阵列游戏。给出一个N个整数的数组A0,A1,...,AN-1。然后给出Q查询,每个查询包含一个整数K.他必须告诉有多少子数组符合条件:函数foo在应用于子数组时返回K.
在该问题中,子阵列被定义为连续元素序列Ai,Ai + 1,...,Aj,其中0≤i≤j≤N-1。函数foo应用于数组时,返回数组中所有元素的最小值。
例如,当foo应用于数组[7,5,10,7,5,8]时,foo返回5。请注意,当且仅当i≠k或j≠l时,子阵列Ai,Ai + 1,...,Aj和Ak,Ak + 1,...,Al才不同。
输入
第一行输入包含N,表示数组的大小。下一行包含N个空格分隔的整数A0,A1,...,AN-1,表示该数组。然后下一行包含Q,表示查询的数量。每个查询每行包含一个整数,表示K。
输出
对于每个查询,打印所需数量的子数组。
输入:
5
4 1 2 3 4
4
3
4
6
1
VS2012和gcc 4.3.2中的输出
2
2
0
8
gcc 4.8.1和c ++ 11中的输出是:
2
2
0
24
代码:
int main() {
map <int, vector<int> >b;
int arr[51], n;
int ans = 0;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> arr[i];
b[arr[i]].push_back(i);
}
int q, query, pos, l1, l2, vlength;
cin >> q;
while (q--)
{
ans = 0, l1 = 0, l2 = 0;
cin >> query;
vlength = b[query].size();
int t = 0, c = 0;
while (t < vlength){
c = 1;
for (size_t i = b[query].at(t) + 1; (i<n) && (arr[i] >= query); i++)
if (arr[i] == query)
{
c++;
}
for (size_t i = 0; i < c; i++)
{
l2 = 0;
for (size_t k = b[query].at(t + i) - 1; (k >= 0) && (arr[k] > query); k--)
l2++;
for (size_t j = i; j < c; j++)
{
l1 = 0;
for (size_t m = b[query].at(t + j) + 1; (m<n) && (arr[m] > query); m++)
l1++;
ans += (l1 + 1)*(l2 + 1);
}
}
t += c;
}
cout << ans << endl;
}
return 0;
}
答案 0 :(得分:2)
这是由于下标超出范围。通过更改
进行双重检查int arr[51];
到
array<int, 51> arr;
你应该得到断言错误。我怀疑不同的输出是由于处理数组索引超出绑定的不同编译器行为的结果,在一种情况下分配arr [i]其中i&gt; 50正在改变某些其他变量的值。