查看: 2467|回復: 1
打印 上一主題 下一主題

[TOJ] 7 - 加加加加加速度

[複製鏈接]
  • TA的每日心情
    鬱悶
    2015-5-15 22:38
  • 簽到天數: 33 天

    [LV.5]常住居民I

    75

    主題

    302

    帖子

    766

    積分

    版主

    TFcis - 105 附設監工官

    Rank: 7Rank: 7Rank: 7

    積分
    766

    台南一中資訊社程式設計達人 - 2014

    跳轉到指定樓層
    樓主
    發表於 2014-6-4 23:28:11 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

    趕快加入我們來參與討論吧!

    您需要 登錄 才可以下載或查看,沒有帳號?加入我們

    x
    本帖最後由 jd3 於 2014-9-25 19:29 編輯



    題意釐清:
    這題沒什麼技巧
    就是看懂目的要算斜率
    也就是一直差分到剩下一個值
    (這敘述不好懂是我的錯...)

    解題方法:
    根據實測
    目前設定只要IO用scanf和printf就幾乎一定會過(如果你沒有包太多函式的話)


    O(N^2)做法:直接陣列差分下去爆(若改時限後可能不會過(先讓我慚愧一下))

    O(N)的做法:觀察在差分時的運算
    化簡後會發現最後的值會呈現很漂亮的2項式展開的係數、正負相間
    要注意的是數列有機數項和有偶數項會影響是正的開頭還是負的開頭
    這邊只要用a b c d往下畫出來舉個例就能瞭解了


    不過就算有O(N)的解法,速度快一些,還是會可能卡IO

    CODE:
    O(N^2):
    #include<iostream>
  • #include<cstdio>

  • using namespace std;

  • int main()
  • {
  •     int t;
  •     int n;
  •     int list[100];
  •    
  •    
  •     scanf("%d",&t);
  •     while(t--)
  •     {
  •         scanf("%d",&n);
  •         for(int i = 1 ; i <= n+1 ; i++)
  •             scanf("%d",&list[i]);
  •         
  •         for(int i = n ; i > 0 ; i--)
  •         {
  •             for(int j = 1 ; j <= i ; j++)
  •             {
  •                 list[j] = list[j+1]-list[j];
  •             }
  •         }
  •    
  •         printf("%d\n",list[1]);
  •     }
  •    
  •     return 0;
  • }

  • O(N):
    #include<iostream>
  • #include<cstdio>

  • using namespace std;

  • int main()
  • {
  •     int t;
  •     int n;
  •     int list[100];
  •     int cn;
  •    
  •     scanf("%d",&t);
  •     while(t--)
  •     {
  •         scanf("%d",&n);
  •         for(int i = 0 ; i <= n ; i++)
  •             scanf("%d",&list[i]);
  •         
  •         
  •         int ans = 0;
  •         cn = 0;   
  •         for(int i = 0, j = ((-(n&1))<<1)+1 ; i <= n ; i++, j*=(-1))
  •         {
  •             if(cn==0)
  •                 cn=1;
  •             else
  •                 cn = cn*(n-i+1)/i;
  •             ans += list[i]*cn*j;
  •         }
  •         
  •         printf("%d\n",ans);
  •     }
  •    
  •     return 0;
  • }




  • 點評

    使用 cin/cout + vector 用 O(n^2) 方法(就最直覺的那個)解的話,確實會 TLE,但只要 ios::sync_with_stdio(false) 並在每次開新 vector 時事先指定 size 就可以AC了。  發表於 2014-6-8 16:47

    評分

    參與人數 1金幣 +2 收起 理由
    Sylveon + 2

    查看全部評分

    <這是個人簽名欄位>
    回復

    使用道具 檢舉

    您需要登錄後才可以回帖 登入 | 加入我們

    本版積分規則

    快速回覆 返回頂部 返回列表