引き続き、B問題を解いていきます。やはり、A問題のようにサクサクはいきませんね〜。
ABC B048 – Between a and b …
問題
非負の整数a,b(a≤b)と、正の整数 xが与えられます。a以上b以下の整数のうち、xで割り切れるものの個数を求めてください。
自分の回答
#include <bits/stdc++.h>
using namespace std;
int main() {
long int a, b, x;
cin >> a >> b >> x;
long int b_multiple = b / x ;
long int a_multiple;
if(a == 0){
b_multiple = b / x + 1;
}else{
b_multiple = b / x ;
}
if(a == 0){
a_multiple = 0;
}else{
a_multiple = (a - 1) / x;
}
cout << b_multiple - a_multiple << endl;
}
aまたはbまでのxの倍数を求めて、差をとってあげればほぼ答えになります。1からaまでのxの倍数の数はa/xで求められます。しかし、気をつけなければいけない点もいくつかあります。
まずはbの倍数(b_multiple)から求めていきます。1からbまでのxの倍数の数はb/xで求まります。注意するのは求まるのは“1から”と言う点です。aが0だった場合は0も倍数に含まれるので、b/xにプラス1をしてあげます。
次にaの倍数(a_multiple)を求めます。bの倍数を求めた時と違って、a/xではなく、(a-1)/xとしています。これは、問題文でa以上としてあるので、aがxの倍数だった場合、a自身はa_multipleから除いてあげないといけないためです。文だとわかりづらいので、下に例を示します。
例 a=4, b=8, x=2の時
bの倍数(b_multiple) = 8 / 2 = 4 (8までの2の倍数は2,4,6,8で4つ)
aの倍数(a_multiple) = 4 / 2 = 2 (4までの2の倍数は2,4,で2つ)
このまま、b_multiple - a_multipleをしてしまうと、答えは2となり、間違いとなります。
なぜなら、a_multipleの中に4が含まれてしまっているからです。
なので、a_multipleを求める時はa-1/xとして、a自身を考慮しないようにしなくてはいけません。
ABC 049B – たてなが
問題
縦Hピクセル、横Wピクセルの画像があります。全てのピクセルは.
または*
で表されるものとします。上からi番目、左からj番目のピクセルを表す文字を Ci,jで表します。
この画像を2倍縦長にした画像を出力してください。すなわち、縦2Hピクセル、横Wピクセルの画像であって、上からi番目、左からj番目のピクセルは、C(i+1)/2,j(ただし、割り算は切り捨て)と等しい画像を出力してください。
自分の回答
#include <bits/stdc++.h>
using namespace std;
int main() {
int H, W;
cin >> H >> W;
string a;
for (int i = 0; i < H; i++) {
cin >> a;
cout << a << endl;
cout << a << endl;
}
}
ラッキー問題ですね。
ABC B050 – Contest with Drinks Easy
問題
joisinoお姉ちゃんは、あるプログラミングコンテストの決勝を控えています。 このコンテストでは、N問の問題が用意されており、それらには1~Nの番号がついています。 joisinoお姉ちゃんは、問題 i(1≦i≦N)を解くのにかかる時間がTi秒であることを知っています。
また、このコンテストでは、M種類のドリンクが提供されており、1~Mの番号がついています。 そして、ドリンクi(1≦i≦M)を飲むと、脳が刺激され、問題Piを解くのにかかる時間がXi秒になります。 他の問題を解くのにかかる時間に変化はありません。
コンテスタントは、コンテスト開始前にいずれかのドリンクを1本だけ飲むことができます。 joisinoお姉ちゃんは、それぞれのドリンクについて、それを飲んだ際に、全ての問題を解くのに何秒必要なのかを知りたくなりました。 全ての問題を解くのに必要な時間とは、それぞれの問題を解くのにかかる時間の合計です。 あなたの仕事は、joisinoお姉ちゃんの代わりにこれを求めるプログラムを作成することです。
自分の回答
#include <bits/stdc++.h>
using namespace std;
int main() {
int N;
cin >> N;
vector <int> T(N);
int t;
for (int i = 0; i < N; i++) {
cin >> t;
T.at(i) = t;
}
int M;
cin >> M;
vector <int> T_cal(N);
int P, X;
for (int i = 0; i < M; i++) {
T_cal = T;
cin >> P >> X;
T_cal[P-1] = X;
cout << accumulate(T_cal.begin(), T_cal.end(), 0) << endl;
}
}
問題文が長くて難しいかなと思いましたが、そんなに難しくなかったです。
与えられた、問題を解く時間をTに格納し、その後、P-1番目をXに入れ替えて、Tの合計値を出力すればいいです。配列は0から始まるのでP-1としています。合計値を出すために、accumulate関数を使っていますね。
accumulate関数
初期値initに対して、範囲(first,last)の各要素を前から順番に足し合わせます。
accumulate(first, last, init)という形で用います。通常に使う場合、第三引数には0を渡します。また、出力を小数にしたい時は、0.0という風に渡せば、小数となります。