#14444: TLE何解


Aaaaaaaaaaaaa (羅傑)

學校 : 臺北市立大同高級中學
編號 : 69102
來源 : [111.235.208.242]
最後登入時間 :
2023-09-13 09:02:41
d712. The 3n + 1 problem -- ms0472904 | From: [203.72.178.252] | 發表日期 : 2018-07-17 15:02

 

#include<iostream>
using namespace std;
int main(){
long long int a,b,i,n,t,max=0,sum=1;
while(cin>>a>>b){
cout<<a<<" "<<b<<" ";
if(a>b) {t=a; a=b; b=t;}
for(i=a; i<=b; i++){
n=i;
while(n!=1){
sum++;
if(n%2!=0) n=3*n+1;
else n/=2;
}
if(sum>max) max=sum;
sum=1;
}
cout<<max<<endl;
max=0;
}
}
會TLE,請各位大大教一下
 
#15021: Re:TLE何解


314159265358979323846264338327 ... (少年π)

學校 : 臺北市私立延平高級中學
編號 : 69058
來源 : [223.137.149.175]
最後登入時間 :
2024-11-18 16:24:11
d712. The 3n + 1 problem -- ms0472904 | From: [223.140.106.179] | 發表日期 : 2018-09-01 16:15

 

#include
using namespace std;
int main(){
long long int a,b,i,n,t,max=0,sum=1;
while(cin>>a>>b){
cout<<a<<" "<<b<<" ";
if(a>b) {t=a; a=b; b=t;}
for(i=a; i<=b; i++){
n=i;
while(n!=1){
sum++;
if(n%2!=0) n=3*n+1;
else n/=2;
}
if(sum>max) max=sum;
sum=1;
}
cout<<max<<endl;
max=0;
}
}
會TLE,請各位大大教一下

都是YP的,提供你幾個意見

運算法:
1.n/=2替換成n>>1,用位元平移處理比較快,比用除法快了6倍左右
2.n*3+1的結果必為偶數,直接跳到n>>1,減少判斷次數

3.把跑過的數字存起來,減少重複跑的次數

輸入輸出:

1.加入ios::sync_with_stdio(false);關閉cin,cout與scanf,printf的同步

2.加入cin.tie(0);使cin,cout鬆綁

3.把endl換成'\n'

 

 
ZeroJudge Forum