惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tenable Blog
博客园_首页
Vercel News
Vercel News
WordPress大学
WordPress大学
美团技术团队
G
Google Developers Blog
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Y
Y Combinator Blog
博客园 - 【当耐特】
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
The Cloudflare Blog
T
The Blog of Author Tim Ferriss
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google DeepMind News
Google DeepMind News
云风的 BLOG
云风的 BLOG
腾讯CDC
M
MIT News - Artificial intelligence
爱范儿
爱范儿
Recent Announcements
Recent Announcements
雷峰网
雷峰网
Last Week in AI
Last Week in AI
宝玉的分享
宝玉的分享
The Register - Security
The Register - Security
Jina AI
Jina AI
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Hugging Face - Blog
Hugging Face - Blog
P
Privacy & Cybersecurity Law Blog
Recorded Future
Recorded Future
Help Net Security
Help Net Security
N
News and Events Feed by Topic
博客园 - Franky
P
Proofpoint News Feed
L
LINUX DO - 热门话题
S
SegmentFault 最新的问题
The GitHub Blog
The GitHub Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
月光博客
月光博客
D
Docker
Google DeepMind News
Google DeepMind News
有赞技术团队
有赞技术团队
IT之家
IT之家
Security Latest
Security Latest
L
LangChain Blog
V
V2EX
阮一峰的网络日志
阮一峰的网络日志
J
Java Code Geeks

hayato

Chromium's DOM Deep Dive: Understanding Shadow DOM and Tree Structures - hayato Introducing the Task Scheduler in Chromium's Network Stack: A 0.3% Improvement in Loading Speed - hayato 出版のお知らせ 「普通の人が資産運用で99点をとる方法とその考え方」 - hayato Resource loading with Content Addressable Bundles - hayato 普通の人が資産運用で99点をとる方法とその考え方 - hayato Imperative Shadow DOM Distribution API - hayato Google にソフトウェアエンジニアとして入社して 10 年と 10 日がたちました - hayato Web のつくりかた: ソフトウェアエンジニアリングと雰囲気で理解する Web 標準とブラウザのつくりかた - hayato ブラウザのしくみ: データ構造とアルゴリズムと雰囲気で理解する DOM と Shadow DOM - hayato Rust が最強のプログラミング言語である証明 - hayato 六本木ではたらくソフトウェアエンジニアへのよくある質問とその答え (FAQ) (2015 - 2017) - hayato What's New in Shadow DOM v1 (by examples) - hayato Simple timer application for the pomodoro technique - hayato Google の面接試験で出る (はずがない)「海賊と金貨」問題を空気を読まないでプログラムで解いてみる - hayato hayato.io (4topcoder) - hayato SRM432 - hayato SRM405 - hayato SRM386 - hayato SRM385 - hayato SRM384 - ゲーム - hayato SRM369 - hayato SRM368 - hayato SRM366 - typo 2 連発 - hayato Python - generator で素数生成 - hayato New Launguage - 新言語追加の予定? - hayato lxml で HTML スクレーピング - hayato SRM358 - Today is a Bad Day (-50). - hayato SRM349 FizzBuzz 問題が簡単すぎるそんなあなたへ。「赤いマーブル問題」。 - hayato Suffix Array - hayato google-code-prettify を導入してみる - hayato Subset の生成 - hayato 2006 年のまとめ - SRM332 - hayato Google Code Jam 2006 - Championship Round - hayato Blogger Beta に移行 - hayato Google Code Jam 2006 - Round1 に挑戦 - Generics と AutoBoxing - hayato Google Code Jam 2006 - Qualification Round 通過 - hayato Google Code Jam 2006 - Qualification Round に挑戦 - hayato Google Code Jam 2006 - Practice1 - hayato Google Code Jam 2006 - 開催決定 - hayato Stay tuned... Global Google Code Jam 2006 - 秋に開催? - hayato SRM308 - Hard DP - hayato SRM304 - 条件付確率 - hayato JavaWorld に寄稿しました - hayato 2006 TopCoder Open Final Round - hayato IBM Rational Software Development Forum Tokyo で講演します - hayato SRM298 - ひとふで書き - hayato SRM293 - ビンゴ - hayato 2006 TopCoder Open - Round1 撃墜 - hayato 2006 TopCoder Open - Odds 発表 - hayato 2006 TopCoder Open Qualification Round - hayato SRM291 - OutOfMemory - hayato デブサミ 2006 で講演します - hayato SRM287 - 気分は中学生?連立2元方程式 - hayato SRM281 - 2006 年はポイントゼロスタート - hayato SRM280 - Challenge 祭り - hayato SRM277 - 初賞金げっと - hayato マラソン・マッチ - hayato reStructuredText で blogger - hayato 2006 TopCoder Open - NSA がスポンサーに - hayato SRM276 - お買い物は楽しく DP で - hayato SRM273 - bit 演算は int で行われるのね - hayato JavaOne Tokyo で講演します - hayato SRM270 - Integer == Integer - hayato SRM268 - Division2 脱出 - hayato SRM266 - NASA, we have a problem... - hayato SRM265 - Division2 落ち... - hayato SRM262 - 初 Division1 は Typo に終わる - hayato SRM260 - TopCoder への挑戦のはじまり - hayato
SRM272 - Division1 - 4 度目の正直 - hayato
2005-11-19 · via hayato

SRM272 に挑戦.今回の SRM は,msn がスポンサーです.$5,000 の賞金がでます. TopCoder では,ときどきこのような Sponsored Match が行わています.優秀な人材がほしい企業と,名を売りたい人たちの出会いの場の役目も果たしています.

250 点問題. 数字(0〜9)が最大 5 個与えられます.それらを並べ替えてできる最大 5 桁の数のうち,Factor(約数)の数が最も少ないものを求める問題です.たかだか最大 5 個ですので,全ての並び方を試せば OK です.いわゆる permutation です. C++ だと, STL にその名もずばり next_permutation() がありますので,それを使うとよいです. C++以外の言語では,DFS (depth first search)で再帰的に permutation を生成すればよいでしょう.

500 点問題. A 社の代表 (countA)人 と B 社の代表 (countB) 人が円卓に座ってミーティングをします. 椅子の数 は (chairs) です.同じ会社の人どおしは,隣り合って座ってもよいですが, A 社の人と B 社の人は,間に距離をいす(minDistance) 分だけあけて座らなければいけません.

  • minDistance = 1 は,隣り合っていてもいいです.
  • minDistance = 2 だと,間に最低 1 つのいすが必要.
  • minDistance = 3 だと,間に最低 2 つのいすが必要.
  • ...

というわけです.可能な座り方の数はいくつか? という問題です. SRM では,Recursive と Memoization というパターンでときました.この手の問題は,DP(Dynamic Programming:動的計画法)を用いることもできます. こんな感じになります.

public class RoundTable {

  public long arrangements(int countA, int countB, int chairs, int minDis) {
    long[][][][][] dp = new long[chairs][minDis][minDis][countA+1][countB+1];
    dp[0][0][minDis-1][countA-1][countB] = 1;
    for (int c = 1; c < chairs; c++) {
        for (int pa = 0; pa < minDis; pa++) {
            for (int pb = 0; pb < minDis; pb++) {
                for (int a = 0; a <= countA; a++) {
                    for (int b = 0; b <= countB; b++) {
                        int npa = Math.min(minDis-1, pa+1);
                        int npb = Math.min(minDis-1, pb+1);
                        // Neither sit on the chair
                        dp[c][npa][npb][a][b] += dp[c-1][pa][pb][a][b];

                        // Arep can sit on the chair
                        if (pb == minDis-1 && a > 0)
                            dp[c][0][minDis-1][a-1][b] += dp[c-1][pa][pb][a][b] * a;

                        // Brep can sit on the chair
                        if (pa == minDis-1 && b > 0 && c + minDis <= chairs )
                            dp[c][minDis-1][0][a][b-1] += dp[c-1][pa][pb][a][b] * b;
                    }
                }
            }
        }
    }

    long ret = 0;
    for (int pa = 0; pa < minDis; pa++) {
        for (int pb = 0; pb < minDis; pb++) {
            ret += dp[chairs-1][pa][pb][0][0];
        }
    }
    return ret * chairs;
  }
}

レーティングが高い人たちは,平気で DP を使用してきます.

1000 点問題. これも,DP でいけると思ったのですけど,500 点問題で時間をほとんど使いきったため,さすがに時間が足りませんでした. グラフをつくって,Dijkstra 法でもいけます.1000 点問題にしては,とっかかりやすいかと.

結果

System Test の結果です. ( Room Statistics )

Room Statistics

ようやく,Division1 ではじめて System Test に通りました. Level2 問題も解けたので,充実感. レーティングは 1214 -> 1429 と上昇しました.