题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1005
Memory Limit Exceeded(内存超限)的代码 :
错误示范,用的递归但是超时了。
#include <bits/stdc++.h>
using namespace std;
int A,B,n;
const int maxn = 1e8;
int a[maxn];
void fn(){
a[1] = a[2] = 1;
for(int i =3;i<=maxn;i++){
a[i] = (A * a[i-1] + B * a[i-2])% 7;
}
}
int main(){
ios::sync_with_stdio(0);
while(cin>>A>>B>>n&&A!=0&&B!=0&&n!=0){
fn();
cout<<a[n]<<endl;
memset(a,0,sizeof(a));
}
return 0;
}
AC代码:
发现for循环小于等于1000时会Time Limit Exceeded,但是只小于时就AC掉???
由于f(n)会mod7,所以猜测可能存在周期性,
if(a[i]==1&&a[i-1]==1) break;
判读如果存在那么就结束计算每个值,然后利用周期性来输出答案即可。可以理解为是在找规律。
#include <bits/stdc++.h>
using namespace std;
int A,B,n,i,T;
int a[1000];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
a[1] = a[2] = 1;
while(cin>>A>>B>>n && ( A!=0 || B!=0 || n!=0)){
for(i = 3;i<1000;i++){
a[i] = ( A * a[i-1] + B * a[i-2]) % 7;
if(a[i]==1&&a[i-1]==1){//完成一个周期
break;
}
}
T = i-2;//周期的值
if(n%T==0) cout<<a[T]<<endl;
else{
cout<<a[n%T]<<endl;
}
}
return 0;
}
解决HDU1005内存超限与时间超限问题
本文详细分析了HDU1005题目的两种解决方案,一种导致MemoryLimitExceeded,另一种则通过发现周期性规律成功避免TimeLimitExceeded,实现了AC。通过对比,讲解了如何优化递归算法,使用更少的资源找到问题的规律。
488

被折叠的 条评论
为什么被折叠?



