20141203 第5回社内勉強会(佐藤)4. 問題
n個の仕事があります。
各仕事は時間siにはじまり、時間tiに終わります。あなたは各仕事につ
いて、参加するか参加しないかを選ばなければなりません。
仕事に参加するならば、その仕事のはじめから終わりまで参加しなけ
ればなりません。
また、参加する仕事の時間帯が重なってはなりません。(開始の瞬間・
終了の瞬間だけが重なるのも許されません)
できるだけ多くの仕事に参加したいです。何個の仕事に参加すること
ができるでしょうか。
制約
1 ≦ N ≦ 100000
1 ≦ si ≦ 109
5. 例
入力
n = 5, s = {1, 2, 4, 6, 8}, t = {3, 5, 7, 9, 10}
出力
3 (仕事1, 3, 5を選択)
仕事1
仕事2
仕事3
仕事4
仕事5
9. 例
1円玉, 5円玉, 10円玉, 50円玉, 100円玉, 500円玉が
それぞれ、C1, C5, C10, C50, C100, C500枚ずつあります。
できるだけ少ない枚数の硬貨
でA円を支払いたいと考えています。何枚の硬貨を出す必
要があるでしょうか?
なお、そのような支払い方は少なくとも一つは存在する
とします。
制約
0 ≦ C1, C5, C10, C50, C100, C500 ≦ 109
0 ≦ A ≦ 109
11. 解答: ソース
//コインの金額
const int V[6] = {1, 5, 10, 50, 100, 500};
//入力
int C[6]; // C[0] = C_1, C[1] = C_5, ・・・
void solve() {
int ans = 0;
for (int i = 5; i >= 0; i- -) {
int t = min(A/V[i], C[i]);//コインiを使う枚数
A -= t * V[i];
ans += t;
}
printf(“%dn”, ans);
}
14. 問題
n個の仕事があります。
各仕事は時間siにはじまり、時間tiに終わります。あなたは各仕事につ
いて、参加するか参加しないかを選ばなければなりません。
仕事に参加するならば、その仕事のはじめから終わりまで参加しなけ
ればなりません。
また、参加する仕事の時間帯が重なってはなりません。(開始の瞬間・
終了の瞬間だけが重なるのも許されません)
できるだけ多くの仕事に参加したいです。何個の仕事に参加すること
ができるでしょうか。
制約
1 ≦ N ≦ 100000
1 ≦ si ≦ 109
15. 例
入力
n = 5, s = {1, 2, 4, 6, 8}, t = {3, 5, 7, 9, 10}
出力
3 (仕事1, 3, 5を選択)
仕事1
仕事2
仕事3
仕事4
仕事5
17. 解答: ソース(2段ですまぬ)
const int MAX_N = 100000;
//入力
int N, S[MAX_N], T[MAX_N];
//仕事をソートするためのpairの配列
pair<int, int> itv[MAX_N];
void solve() {
//pairは辞書順で比較される
//終了時間の早い順にしたいため、T
をfirstに、Sをsecondにいれる。
for (int i = 0; i < N; i++) {
itv[i].first = T[i];
itv[i].second = S[i];
}
sort(itv, itv + N);
//tは最後に選んだ仕事の終了時間
int ans = 0, t = 0;
for (int i = 0; i < N; i++){
if (t < itv[i].second) {
ans++;
t = itv[i].first;
}
}
printf(“%dn”, ans);
}