Re: [問題] 高中生解題系統B568一問
※ 引述《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,
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
09/14 13:56, 1F
推
09/14 18:40,
7年前
, 2F
09/14 18:40, 2F
推
09/15 15:48,
7年前
, 3F
09/15 15:48, 3F
→
09/15 15:49,
7年前
, 4F
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
09/15 16:18, 7F
→
09/15 16:19,
7年前
, 8F
09/15 16:19, 8F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章