Re: [問題] 高中生解題系統B568一問

看板C_and_CPP (C/C++)作者 (雲川閒步)時間7年前 (2018/09/14 12:19), 7年前編輯推噓4(404)
留言8則, 4人參與, 7年前最新討論串3/3 (看更多)
※ 引述《cutekid (可愛小孩子)》之銘言: 解法: 動態規劃, 空間複雜度: 700,000, 時間複雜度: 700,000 x n(題目) 以下程式碼(約20行): #include<stdio.h> #define MAX 700000 int main(){ int i,k,n,v; char dp[MAX + 1] = {0}; for(scanf("%d",&n); scanf("%d",&k) != EOF; --n){ for(i = 1; i <= MAX; ++i){ if(dp[i] && dp[i] != n){ v = (i + k - 1) % MAX + 1; if(!dp[v]) dp[v] = n; } else if(i == k) dp[i] = n; } } for(i = MAX;!dp[i];--i); printf("%d\n",i); return 0; } ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.168.23.228 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1536758808.A.996.html

09/13 09:07,
簡單明瞭 推
09/13 09:07

09/13 23:42,
不好意思 菜逼八是我其實看了很久還是不懂…
09/13 23:42

09/13 23:43,
請問可以提示一點code的方向讓我推論嗎?
09/13 23:43

09/14 00:18,
還沒消化先給推
09/14 00:18
其實邏輯很簡單 甚至有點暴力 就是把所有可能的數字和 都標記在dp陣列裡面 因為題目上限七十萬 所以數字和不會爆掉 dp[i] != 0 表示i是一個可能的解(數字和) 他很巧妙的在迴圈中用dp[i]的值標記這是新加入的數字 避免重複計算 最後從dp[MAX]倒著看回來 第一個非0的陣列index就是答案 話說這個解法在系統上是50ms左右的時間 看排行榜還有一堆4ms的 就不知道是什麼神奇解法了 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 100.0.196.193 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1536898744.A.146.html ※ 編輯: cateran (100.0.196.193), 09/14/2018 12:23:40

09/14 13:56, 7年前 , 1F
推,解釋的真好(Y)
09/14 13:56, 1F

09/14 18:40, 7年前 , 2F
非常感謝,小弟終於看懂了,覺得有夠感動XD
09/14 18:40, 2F

09/15 15:48, 7年前 , 3F
其實我蠻好奇在打 code 之前要怎麼確定 700000*n 的
09/15 15:48, 3F

09/15 15:49, 7年前 , 4F
時間複雜度不會超過上限,畢竟看到 700000 大概就先
09/15 15:49, 4F

09/15 15:49, 7年前 , 5F
倒退三步了吧,哪有心情想算法
09/15 15:49, 5F

09/15 15:55, 7年前 , 6F
剛剛也看懂了,心情真舒爽
09/15 15:55, 6F

09/15 16:18, 7年前 , 7F
以我自己過往的經驗 不考慮常數的話 10^8會當作1秒
09/15 16:18, 7F

09/15 16:19, 7年前 , 8F
不過judge的機器可能很好 10^9也不會TLE
09/15 16:19, 8F
文章代碼(AID): #1RcpQu56 (C_and_CPP)
文章代碼(AID): #1RcpQu56 (C_and_CPP)