【发布时间】:2019-12-05 16:45:20
【问题描述】:
以下代码接受一个整数 t,然后再接受 3 个整数 t 次,并返回您可以从两个不同的整数中减去 1 的最大次数同时,当只剩下 1 个大于 0 的整数时程序停止。问题已经解决了,但是想降低代码的时间复杂度不知道怎么做。
#include <bits/stdc++.h>
using namespace std;
int main() {
long long t, r, g, b, arr[1000], count = 0;
bool isMax=true;
cin >> t;
for (long long i = 0; i < t; i++) {
cin >> r >> g >> b;
arr[0] = r;
arr[1] = g;
arr[2] = b;
for (long long j = 0; j < 3; j++) {
for (long long k = 0; k < 2; k++) {
if (arr[k] > arr[k + 1]) {
long long a = arr[k];
long long b = arr[k + 1];
arr[k] = b;
arr[k + 1] = a;
}
}
}
count = 0;
if (arr[2] == 1) {
cout << 1 << endl;
} else if (arr[0] + arr[1] <= arr[2]) {
cout << arr[0] + arr[1] << endl;
} else {
while (arr[0] > 0) {
while (isMax && arr[0] > 0) {
arr[2]--;
arr[0]--;
count++;
if (arr[2] < arr[1]) {
isMax = false;
}
}
while (!isMax && arr[0] > 0) {
arr[1]--;
arr[0]--;
count++;
if (arr[1] < arr[2]) {
isMax = true;
}
}
}
while (arr[2] > 0 && arr[1] > 0) {
arr[2]--;
arr[1]--;
count++;
}
cout << count << endl;
}
}
}
如何在不使用所有这些增加时间复杂度的循环的情况下获得相同的输出?
编辑:我不希望我的代码为我重写,这是家庭作业,我想要的只是提示和帮助,这样我就可以降低时间复杂度,我不知道该怎么做。
编辑 2:在我的算法中,我按升序对 3 个数字进行排序,然后使用 while 循环检查最小数字 (s/arr[0]) 是否 > 0。之后,我再使用两个while 循环在最大和中等大小的数字之间交替(分别为 l/arr[2] 和 m/arr[1])并从变量 s 和 l 或 m 中减少(交替)。当 s 变为 0 时,这意味着我可以将 l 和 m 递减,直到其中一个等于 0,然后我打印 count 变量(我每次递减两个变量时递增 count)。
【问题讨论】:
-
听起来像家庭作业?
-
而不是向我们展示代码并要求我们为您重写它——因为这是一个关于算法和复杂性的问题——也许你可以向我们描述你的算法并询问如何制作的技巧它更优化?就目前而言,这看起来像是“为我编写代码”的家庭作业问题。
-
我不想为我重写代码,我想知道如何降低时间复杂度。
-
想一想:如何才能完全删除最内层的循环,在每次迭代中只增加/减少计数器?
-
您可以通过使用不同的算法来降低复杂性。相同的算法具有固定的复杂度(假设实现没有搞砸)
标签: c++ algorithm time-complexity