TopCoder SRM570に参加した記録です。
当日の感想
今回で3回目の参戦。
英語の問題文にひるまないだけの度胸はついた。
当初思っていたよりも難しくはないことは分かった。
プログラミングをしているよりも、白紙に向かっていろいろと数式を書いている時間の方が長い。プログラミングは、考えた解法をそのまま書くだけと言った感じ。
言語の壁という点では、英語よりもC++の知識が乏しいのがつらい。
vectorの使い方がわからなかったり。(配列のサイズの求め方がわからん!)
わからなくなったら独習C++を元にガンパル。
Level 1 : Chopsticks
問題
異なる長さの箸がN本ある。
同じ長さのペアの数がパーティーに招待できる人数。
さあ、招待できる人数の最大値を求めよ。
システムテストで落とされた。なぜだろう。
連想配列を利用して、参考書を見ながらもう少し綺麗に書きなおした。
連想配列が空気を吸うように使いこなせればいいな。
/* TopCoder
* SRM : 570
* Division : 1
* Level : 2
*
*/
#include <algorithm>
#include <iostream>
#include <map>
#include <numeric>
#include <set>
#include <sstream>
#include <string>
#include <vector>
using namespace std;
#define FOR(i,s,e) for (int i = int(s); i != int(e); i++)
#define FORIT(i,c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define ISEQ(c) (c).begin(), (c).end()
class Chopsticks {
public: int getmax(vector<int> length) {
map<int, int> dic;
for (int i = 0; i < (int)length.size(); i++) {
dic[length[i]] = 0;
}
for (int i = 0; i < (int)length.size(); i++) {
dic[length[i]]++;
}
int ans = 0;
map<int, int>::iterator it;
for (it = dic.begin() ; it != dic.end(); it++) {
ans += ( (*it).second /2);
}
return ans;
}
};
Level 2 : RobotHerbDiv2
問題
ロポットが与えられた配列と規則に従って移動する。
最終的に移動した場所の原点からの距離を求めよ。
規則を漸化式に起こそうとしたが、途中で時間切れ。