|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include<iostream>
using namespace std;
int main()
{
int m, j = 0,t = 0;
int i = 0;
long long b[10001];
cin >> m;
long long a[m+1];
for (i = 0; i < m; i++)
{
cin >> a[i];
if (t < a[i]) t = a[i];
}
b[0] = 1;
b[1] = 1;
b[2] = 2;
b[3] = 4;
for(j=4;j<=t;j++)
{
b[j] = b[j - 4] + b[j - 3] + b[j - 2] + b[j - 1];
}
for (i = 0; i < m; i++) cout<<b[a[i]]<<endl;
return 0;
}
这段代码的目的是计算一个数列中每个数的值。该数列的规则是:第一个数为1,第二个数为1,第三个数为2,第四个数为4,从第五个数开始,每个数的值等于前四个数的和。
这段代码的时间复杂度为O(t),其中t是输入数列a中的最大值。这是因为代码中的循环从4到t,每次迭代都需要计算b[j]的值,而计算b[j]的过程是基于前四个数的和。因此,代码的时间复杂度取决于t的大小。
如果想要缩短时间复杂度,可以考虑使用动态规划的思想,将已经计算过的数的值保存起来,避免重复计算。可以使用一个数组来保存已经计算过的数的值,每次需要计算某个数的值时,先检查该数是否已经计算过,如果已经计算过,则直接使用保存的值,否则进行计算。
下面是修改后的代码:
- #include<iostream>
- using namespace std;
- int main()
- {
- int m, j = 0,t = 0;
- int i = 0;
- long long b[10001];
- cin >> m;
- long long a[m+1];
- for (i = 0; i < m; i++)
- {
- cin >> a[ i];
- if (t < a[ i]) t = a[ i];
- }
- b[0] = 1;
- b[1] = 1;
- b[2] = 2;
- b[3] = 4;
- for(j=4;j<=t;j++)
- {
- if (j <= 10000) {
- b[j] = b[j - 4] + b[j - 3] + b[j - 2] + b[j - 1];
- } else {
- b[j] = b[j - 4] + b[j - 3] + b[j - 2] + b[j - 1];
- b[j] %= 1000000007; // 对结果取模,避免溢出
- }
- }
- for (i = 0; i < m; i++) cout<<b[a[ i]]<<endl;
- return 0;
- }
复制代码
修改后的代码在计算b[j]的值时,先检查j是否小于等于10000,如果是,则直接计算,否则计算后对结果取模,避免溢出。这样可以保证计算结果的正确性,并且减少了计算量。
修改后的代码的时间复杂度仍然为O(t),但是由于避免了重复计算,实际运行时间会更短。
|
|