#6793: 誰能幫我看看哪裡還能加速…


chriswei84 (QAQQQ)

學校 : 國立交通大學
編號 : 18030
來源 : [140.113.216.53]
最後登入時間 :
2019-02-18 21:18:22
a471. givesum~連續整數的固定和 -- 名題精選百則 | From: [123.110.141.34] | 發表日期 : 2012-07-16 16:56

先附上程式碼:

#include<stdio.h>

#include<stdlib.h>

 

int main(void)

   int n,half,sum;

   int front,rear,times;

   while(scanf("%d",&n)!=EOF)

   {

    for(times=0,half=(n/2)+1,sum=0,rear=0,front=1 ; sum<n ; sum+=(++rear)) 

      ;

    

    while(front<half)

    {

     if(sum>n)

       sum-=(front++);

     else

     {

      if(sum==n)

        printf("%d-%d\n",front,rear),times++;

       sum+=(++rear);

     }

    }

     

    if(!times)

     printf("No Solution...\n");                   

   } 

   return 0;

 

我覺得已經夠快了,

可是上傳第三個測資點卻還是TLE…(以下為檢測結果

第 1 測資點(20%): AC (4ms, 244KB)
通過檢測
第 2 測資點(30%): AC (80ms, 244KB)
通過檢測
第 3 測資點(50%): TLE (3s)
執行逾時

Killed 

 

各位已AC的大大能否告訴我哪裡還有可以加速的地方? 

謝謝~~ 

 
#6803: Re:誰能幫我看看哪裡還能加速…


chriswei84 (QAQQQ)

學校 : 國立交通大學
編號 : 18030
來源 : [140.113.216.53]
最後登入時間 :
2019-02-18 21:18:22
a471. givesum~連續整數的固定和 -- 名題精選百則 | From: [123.110.141.34] | 發表日期 : 2012-07-18 13:46

各位已AC的大大能否告訴我哪裡還有可以加速的地方? 

謝謝~~ 


敝人目前已AC,但跑出來的速度慢到不行…(與上面的程式碼雷同

AC (953ms, 248KB) 

 是否有其他種解法??

如果可以的話請那些跑出來是兩位數ms的大大給一下提示,謝謝!


 

 
#6847: Re:誰能幫我看看哪裡還能加速…


jdh8 (硬邦邦)

學校 : 臺北醫學大學
編號 : 6332
來源 : [122.116.101.60]
最後登入時間 :
2019-11-14 01:20:34
a471. givesum~連續整數的固定和 -- 名題精選百則 | From: [118.160.128.177] | 發表日期 : 2012-07-27 13:31

第 1 測資點(20%):AC (0ms, 308KB)
通過檢測
第 2 測資點(30%): AC (16ms, 308KB)
通過檢測
第 3 測資點(50%): AC (20ms, 308KB)
通過檢測

演算法

如果輸入 X 可表為以 a 為首的連續 n 個整數和,即 a + (a+1) + ... + (a+n-1),則 X = n(2a+n-1)/2,即 2X = n(2a+n-1)。n 和 2a+n-1 都是整數,也是 2X 的因數。

因為 2a+n-1 > n,所以 n < sqrt(2X)。因為輸入頂多一億,陣列只要夠一萬組解即可。

我們讓 n 從 2 開始,往 sqrt(2X)跑:
n 要能整除 2X 才有可能是答案,然後 2X/n - n + 1 = 2a 中的 a 必須要是正整數。
因為 n 越來越大,所以 a 只會越來越小,解出 a <= 0 的時候就可以 break 了。

這樣解是最快的算法,只是給出答案的順序與題目相反,也就是 a 大的會先給。所以我打算宣告 int[20000] 把它存起來,一次存兩個整數:a 跟 a+n-1(首尾)。C 陣列不會記得自己的大小,所以要寫 count 以備將來找得到尾巴。只要注意 count 每次是加 2 應該還蠻簡單的。輸出的時候從尾巴讀回來。

 
#6861: Re:誰能幫我看看哪裡還能加速…


chriswei84 (QAQQQ)

學校 : 國立交通大學
編號 : 18030
來源 : [140.113.216.53]
最後登入時間 :
2019-02-18 21:18:22
a471. givesum~連續整數的固定和 -- 名題精選百則 | From: [123.110.140.2] | 發表日期 : 2012-07-31 18:06

第 1 測資點(20%):AC (0ms, 308KB)
通過檢測
第 2 測資點(30%): AC (16ms, 308KB)
通過檢測
第 3 測資點(50%): AC (20ms, 308KB)
通過檢測

演算法

如果輸入 X 可表為以 a 為首的連續 n 個整數和,即 a + (a+1) + ... + (a+n-1),則 X = n(2a+n-1)/2,即 2X = n(2a+n-1)。n 和 2a+n-1 都是整數,也是 2X 的因數。

因為 2a+n-1 > n,所以 n < sqrt(2X)。因為輸入頂多一億,陣列只要夠一萬組解即可。

我們讓 n 從 2 開始,往 sqrt(2X)跑:
n 要能整除 2X 才有可能是答案,然後 2X/n - n + 1 = 2a 中的 a 必須要是正整數。
因為 n 越來越大,所以 a 只會越來越小,解出 a <= 0 的時候就可以 break 了。

這樣解是最快的算法,只是給出答案的順序與題目相反,也就是 a 大的會先給。所以我打算宣告 int[20000] 把它存起來,一次存兩個整數:a 跟 a+n-1(首尾)。C 陣列不會記得自己的大小,所以要寫 count 以備將來找得到尾巴。只要注意 count 每次是加 2 應該還蠻簡單的。輸出的時候從尾巴讀回來。


喔喔!原來還可以這樣想!
謝謝拉~^^  
ZeroJudge Forum