帮我把这个代码减少时间复杂度#include <iostream> using namespace std; long long found(long long n,long long m) { long long answer=1,i,a; for(i=2;i<=n;i++) { if(i>answer+m) { a=(i-answer)/m; if(a>n-i) a=n-i; i+=a; answer+=a*m; } answer=(answer+m-1)%i+1; } printf("%d\n",answer); return 0; } int main() { long long n,m; while(scanf("%lld%lld",&n,&m)!=EOF) { if(n<2) printf("1\n"); else found(n,m); } return 0; }
时间: 2024-03-10 19:43:22 浏览: 78
这段代码是求解约瑟夫问题的,主要的时间复杂度瓶颈在于for循环中的每次迭代都需要进行一次取模运算,而取模运算是比较耗时的。可以采用数学方法优化代码,将时间复杂度从O(nm)降低到O(logn)。
具体的做法是利用数学推导得到递推公式,用这个递推公式直接计算出结果,避免了每次迭代都需要进行一次取模运算的问题。
下面是优化后的代码:
```c++
#include <iostream>
using namespace std;
long long found(long long n, long long m)
{
long long answer = 1;
for (long long i = 2; i <= n; i++)
{
answer = (answer + m - 1) % i + 1;
}
printf("%lld\n", answer);
return 0;
}
int main()
{
long long n, m;
while (scanf("%lld%lld", &n, &m) != EOF)
{
if (n < 2)
printf("1\n");
else
found(n, m);
}
return 0;
}
```
这段代码的时间复杂度为O(logn),可以大大提高程序的运行效率。
相关问题
请分析一下这段代码的功能、时间复杂度、空间复杂度、优缺点:#include<iostream> using namespace std; const int N = 1e4 + 5; const int T = 1e7 + 5; long long maxValue[T]; long long timeCost[N], medicineValue[N]; long long t, m; int main(){ cin >> t >> m; for (int i = 1; i <= m; i++){ cin >> timeCost[i] >> medicineValue[i]; } for (int i = 1; i <= m; i++){ for (int j = timeCost[i]; j <= t; j++) { maxValue[j] = max(maxValue[j], maxValue[j - timeCost[i]] + medicineValue[i]); } } cout << maxValue[t] << endl; }
这段代码实现了一个背包问题,即有m个药品,每个药品有一个耗时和价值,现在有一个时间上限t,求出在时间上限内所能获得的最大价值。具体实现是使用动态规划算法,用maxValue数组记录前i个药品在j时间内所能获得的最大价值。时间复杂度为O(mt),空间复杂度为O(t),其中m、t分别为药品数量和时间上限。
优点:实现简单,时间复杂度较低,适用于药品数量较少、时间上限较小的背包问题。
缺点:在药品数量较多、时间上限较大时,时间复杂度和空间复杂度都会很高,不适用于大规模背包问题。
D:\ZBY\CodeBase\eigen-3.4.0\Eigen\src\SVD\SVDBase.h:150: error: conflicting declaration of C function 'long long int std::abs(long long int)' using std::abs; ^
这个错误可能是因为您在代码中使用了 `std::abs` 函数,但是有另一个名为 `abs` 的函数与其冲突了。建议您使用 `std::abs` 代替 `abs`,或者使用 `using namespace std;` 来避免命名冲突。例如:
```cpp
#include <iostream>
#include <cmath>
using namespace std;
int main() {
long long int x = -123456789;
cout << abs(x) << endl; // 冲突
cout << std::abs(x) << endl; // 使用 std::abs
return 0;
}
```
如果您仍然想使用 `abs` 函数,您可以将其重命名为其他名称,如:
```cpp
#include <iostream>
#include <cmath>
namespace mymath {
using std::abs;
}
int main() {
long long int x = -123456789;
cout << abs(x) << endl; // 冲突
cout << mymath::abs(x) << endl; // 重命名为 mymath::abs
return 0;
}
```
阅读全文