[問題] 求小於2^64整數立方根 問題:TLE

看板C_and_CPP作者 (喵貓 loves fish)時間15年前 (2009/11/18 12:05), 編輯推噓5(5013)
留言18則, 6人參與, 最新討論串1/1
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) TLE(10s) 希望得到的正確結果: 如何加速演算法 程式跑出來的錯誤結果: 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) dev C++ 有問題的code: (請善用置底文標色功能) #include<iostream> using namespace std; int main() { unsigned long long n; while(cin>>n) { if(!n) break; unsigned long long a=1; while(a<=(n/a)/a) { if(a<=(n/a)/(a*1000000)) a*=100; if(a<=(n/a)/(a*1000)) a*=10; if(a<=(n/a)/(a*125)) a*=5; if(a<=(n/a)/(a*27)) a*=3; //以上這麼一堆也不知道有沒有比較快@@還是反而比較慢? if(a<=(n/a)/(a*8)) a*=2; a++; } printf("%d\n",a-1); } return 0; } 補充說明: -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.228.105.160

11/18 20:08, , 1F
pow或cbrt??
11/18 20:08, 1F

11/18 20:09, , 2F
@@?
11/18 20:09, 2F

11/18 20:09, , 3F
我有看到妳的70ms 囧
11/18 20:09, 3F

11/18 21:55, , 4F
先不管他變快還是變慢, 你的做法a一次至少要跳兩倍
11/18 21:55, 4F

11/18 21:56, , 5F
所以在a>(答案/2)之後還是只能慢慢加
11/18 21:56, 5F

11/18 21:57, , 6F
就算會變快也沒快多少
11/18 21:57, 6F

11/18 21:57, , 7F
試試二分法 ?
11/18 21:57, 7F

11/19 01:53, , 8F
先設變數放n/a結果...少用除法 XD
11/19 01:53, 8F

11/19 11:14, , 9F
二分法會碰到overflow問題 XD 這題需要很多magic number
11/19 11:14, 9F

11/19 14:22, , 10F
二分法為什麼會 overflow ? @@
11/19 14:22, 10F

11/19 16:13, , 11F
因為開始時會把rdelim設到ceil(cubic(longlong_max)+1)
11/19 16:13, 11F

11/19 16:14, , 12F
以求涵蓋longlong_max…所以最後就檢查輸入是不是大於
11/19 16:14, 12F

11/19 16:15, , 13F
pow(ceil(cubic(longlong_max)), 3) 我到底在說啥 XD
11/19 16:15, 13F

11/19 23:27, , 14F
計算 (x+y)/2 可以用 x-(x-y)/2 來避免 overflow
11/19 23:27, 14F

11/19 23:27, , 15F
計算 boolean (a > n^3) 也可以化為 a/n/n > n 避免
11/19 23:27, 15F

11/19 23:28, , 16F
這樣子二分法要的 operation 都有了
11/19 23:28, 16F

11/20 01:06, , 17F
其實後來拿掉比較rdelim和ldelim
11/20 01:06, 17F

11/20 01:07, , 18F
只比較(ldelim + rdelim)/2就不會overflow了 X(
11/20 01:07, 18F
文章代碼(AID): #1B0-CI96 (C_and_CPP)