【发布时间】:2016-10-29 18:35:14
【问题描述】:
我已经尝试在 spoj 上解决这个简单的问题 (http://br.spoj.com/problems/GENERAL/) 已经有一段时间了,但由于某种原因,我不断收到 TLE(超出时间限制)。
由于问题是葡萄牙语,问题的简要描述是这样的(没有故事):
给定一个大小为 N 的数组,你必须将数组排列在 升序,这样一个元素只能交换 距离它 k 的元素。如果数组可以 sorted 然后打印排列它们所需的交换次数 升序,如果不能排序打印 impossivel.
这是我的代码::
#include <iostream>
#include <cstdio>
using namespace std;
int a[100005];
int main() {
int t;
int n, k;
scanf("%d", &t); //number of test cases
while(t--) {
scanf("%d %d", &n, &k);
bool result = true;
int count = 0;
for(int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
for(int i = n; i > 0; i = i - k) {
int j = 0;
for( ; j < i - k; j++) {
if(a[j] > a[j + k]) {
int temp = a[j];
a[j] = a[j + k];
a[j + k] = temp;
count++;
}
}
for( ; j < i - 1; j++) {
if(a[j] > a[j + 1]) {
result = false;
break;
}
}
if(!result)
break;
}
if(result)
printf("%d\n", count);
else
printf("impossivel\n");
}
}
我的逻辑:我对数组执行 N/k 次迭代。我将循环变量 i 初始化为 N。在每次迭代中,我检查 ik 元素与距离它 k 的元素,如果要交换它们,那么我交换它们并增加所需的交换次数,否则我什么都不做。然后我检查从 ik 到 i 的元素,如果它们按升序排列,如果不是,我打破循环并打印“impossivel”,否则我更改 i 到 ik 并再次执行循环。根据我的逻辑,每次迭代后最后的 k 元素将按升序排列,如果可以对它们进行排序,因为在每一步我都会将较大的元素向右移动。
这对您来说是否正确?如何进一步优化呢?感谢您提前提供任何帮助。 :)
【问题讨论】:
-
你可能会在Code Review上得到更好的回复
-
您使用了冒泡排序算法,就时间复杂度而言,这是最糟糕的算法之一。
-
您可以使用诸如
gprof之类的分析工具来确定瓶颈的实际位置。 -
另外,是否有必要显示要求输入的代码和
while循环这样做?为什么不先写代码的“肉”,你知道,真正解决问题的部分,在某种你可以测试的函数中?我在这些 SPOJ 帖子中一遍又一遍地看到这一点——所有输入例程添加的内容都很混乱。 -
@PaulMcKenzie:根据要求,OP 不能使用其他排序。
标签: c++ arrays algorithm sorting