麻烦排序谷歌代码Jam 2018资格赛

Trouble Sort Google CodeJam 2018 Qualifiers

本文关键字:2018 资格赛 Jam 代码 排序 谷歌 麻烦      更新时间:2023-10-16

我试图通过解决几个Code Jam问题来提高我的编程技能。我在2018年预选赛的"麻烦排序"问题上被困了一段时间。我的代码使用控制台中的示例输入生成预期的输出,但在线判断返回"错误答案"。

显然,麻烦排序就像气泡排序一样,除了不是比较第 i 个和第 i+1 个元素,而是比较第 i 个和第 i+2 个元素,如果前者大于后者,则交换元素。这个问题说这个算法是有缺陷的,因为像 897 这样的数组在麻烦排序后将返回 798,它也没有排序。任务是检查对于给定的整数列表,麻烦排序是否能够成功对数组进行排序,或者如果不是,那么哪个是不合适的第一个元素的索引值。

我的代码输入测试的数量 t 和整数列表的大小。然后我复制它,并将一个副本通过气泡排序,另一个通过麻烦排序。然后我逐个比较它们,如果找到一个将两个元素作为不同整数的索引,则输出它。我不确定我在这里做错了什么。

#include<iostream>
#include<vector>
using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;
void swapVal(int& a, int& b)
{
int t = a;
a = b;
b = t;
}
int main()
{
int t;
cin >> t;
for (int i = 1; i <= t; i++)
{
int n;
cin >> n;
vector<int> bs(n);
vector<int> ts(n);
for (int i = 0; i < n; i++)
{
cin >> bs[i];
ts[i] = bs[i];
}
//bubbleSort(bs, n);
{
bool bsSorted = false;
while (!bsSorted)
{
bsSorted = true;
for (int i = 0; i < n - 1; i++)
{
if (bs[i] > bs[i + 1])
{
swapVal(bs[i], bs[i + 1]);
bsSorted = false;
}
}
}
}
//troubleSort(ts, n);
{
bool tsSorted = false;
while (!tsSorted)
{
tsSorted = true;
for (int i = 0; i < n - 2; i++)
{
if (ts[i] > ts[i + 2])
{
swapVal(ts[i], ts[i + 2]);
tsSorted = false;
}
}
}
}
bool same = true;
int minidx = 0;
for (int i = 0; i < n; i++)
{
if (bs[i] != ts[i])
{
same = false;
minidx = i;
break;
}
}
if (same == true)
{
cout << "Case #" << i << ": OK" << endl;
}
else if (same == false)
{
cout << "Case #" << i << ": " << minidx;
}
}
}

我期待法官给我一个点赞许,但它反复返回"错误答案"。我在这里做错了什么?

算法对我来说是正确的。我注意到在错误的情况下,您似乎缺少换行符。因此,两个连续的错误陈述将在同一条线上。

cout << "Case #" << i << ": " << minidx<<'n';

可能会解决您的问题。

几点评论:

  • if (same == true)相当于if(same)if (same == false)相当于if(!same)
  • 已经有std::swap.
  • 有些人可能不喜欢嵌套具有相同名称变量的循环 - 嵌套变量将隐藏外部变量。