kou6839の日記

c++ 競プロ(特にcsacademy) linuxについて書きます。普段は自動車屋さんでナビ開発してます。転職先を探しています!!。

エンベデッドシステムスペシャリストに合格しました。

4/15に受けていた
平成30年春季エンベデッドシステムスペシャリストに合格しました。


自動車、家電、モバイル機器などに搭載する組込みシステムを、ハードウェアとソフトウェアを適切に組み合わせて構築し、求められる機能・性能・品質・セキュリティなどを実現できる組込みエンジニアを目指す方に最適です。
(HPより)

ここに書かれている通り、自動車屋なので受けました。
ただ、AGLのように、自動車・ナビシステムはもう、所謂組み込み屋ではなく、
複雑なシステムとなっています。

<勉強方法>
www.amazon.co.jp

www.amazon.co.jp


この2冊です。
僕の場合は、午前1が免除ではない(基本情報しかもってないし、他の高度も受けたことなし)ので、必須でした。

勉強期間は4週間ほどで、時間で言うと大体午前60時間 午後20時間くらいでした。
午前については、時間があるかぎり周回するしかないです・・・。
過去問の使いまわしが半分と聞いていましたが、蓋をあけてみるとそうでもなく、
午前2がギリギリの通過になってしまいました。
特に電気系の知識はほとんどないので、とにかく過去問だけは解けるというレベルでした。

午後は問題文を読むのが疲れるので、午後1午後2それぞれ1回ずつしかやっていません。

<感想>
上記のとおり雑な勉強方法なのですが、
午後問題については、問題文に書いてあることがきちんと理解できれば、
知識も特に必要ないので、対策時間としては短くなると思います。
ただ、簡単に受かってしまえばしまうほど、知識獲得量・価値は低くなってしまいます。
(ブログネタ以上に活躍することを祈る・・・)

次は秋のネスぺ受験をします。
その前にCCNA,CCNPですが・・・。

ICND1(CCENT)に合格しました

ICND1に合格しました。

890点でした。

<勉強方法>
ping-t (2019/1まで会員です・・・)
1週間で CCNAの基礎が学べる本

<感想>
普通に難しかったです。
ping-tの問題数も多かったので、結構苦労しました。
ping-tでのシミュレーションしか触ってないことや
業務がネットワークとほとんど関係ないかもしれませんが。

ネットワーク・CISCO製品の知識はほぼなかったので、
ほとんど答えを見ながら銅→金を2週しました。


良かったことは、
サブネットやルーティング等linuxでも必要な知識もたくさん学習できたので、
ネットワーク ウッ・・・ みたいな抵抗感が減りました。

次はNNCA(ICND2)を7月中にとります。
(LPIC 304も!)

CSAcademy Triangular Matrix

csacademy.com


<問題>
{N}つの文字列が与えられます。 {i (0 \lt i \lt N)}番目の文字列の長さはiです。
これらNつの文字からひとつずつ文字を選び、辞書順最小の長さNの文字列を答えなさい。
ただし、i番目の文字列のj番目の文字を選んだ場合、
次のi+1番目の文字列からは j or (j+1)番目の文字しか選べません。

<解説>
答える文字列はどう選んでも長さNなので、
先頭から順にアルファベット順に小さい文字を選んでいけばよいです。
ただし、候補がいくつかある場合には、その先の分岐を考える必要があります。
ただ、次の文字列の候補だけを持っておけばよいので、すべてを探索する必要はありません。
(何番目の文字を選んでも、辞書順最小のアルファベットであることは変わりません)

<コード>

int main() {
	cin.tie(0);
	ios::sync_with_stdio(false);


	int n;
	cin >> n;
	string s;
	vi next,tmp;
	next.pb(0);
	rep(i, n) {
		cin >> s;
		char ans = 'z';

		for(auto j :  next) {
			ans = min(ans, s[j]);
		}

		cout << ans;
		for( auto j : next) {
			if (s[j] == ans) {
				tmp.pb(j + 1);
				tmp.pb(j);
			}
		}
		next = tmp;
		tmp.clear();
		UNIQ(next);
	}
	cout << endl;

	return 0;
}

<感想>
週末まではCCENT!!
また日曜頑張ります。

CSAcademy Unfair Game

csacademy.com

<問題>
AlexとBenでゲームをします。
Nつの整数が与えられて、AlexとBenは次のような行動を交互にとります。(Alexが先手)
Atex:1つ以上の整数を選び、和を自分の得点に足す
Ben:1つの整数を選び、和を自分の得点にたす。
どちらかが、最後の整数を選んだらゲーム終了です。
Alexは自分の得点を最大化、BenはAlexの得点を最小化させるように行動するとき、
Alexの得点はいくらになるか。

<解説>
Alexは初手で、0以上の整数をすべてとります。
残った負の整数に対して、ソートして、大きい方から偶数番目・奇数番目のどちらかをとっていくことになるので、シミュレーションします。
0以上の数があるのとないのとでは、初手で偶数番目・奇数番目の調整をする動きがかわります。
ある場合は、負の数を1つもとらないor負の数を1つとることで調整します。
ない場合は、負の数を1つとるor負の数を2つとることで調整します。

<コード>

int main() {
	cin.tie(0);
	ios::sync_with_stdio(false);


	bool all_negative = true;
	int n;
	cin >> n;
	vll a(n);
	rep(i, n)cin >> a[i];
	vll b;
	ll ans = 0;
	rep(i, n) {
		if (a[i] < 0) {
			b.pb(a[i]);
		}
		else {
			ans += a[i];
			all_negative = false;
		}
	}
	
	sort(ALL(b));
	reverse(ALL(b));
	if (!all_negative) {
		int tmp1 = 0;
		for (int i = 0; i < b.size(); i += 2)tmp1 += b[i];
		int tmp2 = 0;
		for (int i = 1; i < b.size(); i += 2)tmp2 += b[i];
		P(ans + max(tmp1, tmp2));
	}
	else {
		int tmp1 = 0;
		for (int i = 0; i < b.size(); i += 2)tmp1 += b[i];
		int tmp2 = b[0];
		for (int i = 1; i < b.size(); i += 2)tmp2 += b[i];
		P(max(tmp1, tmp2));
	}
	return 0;
}

<感想>
テストケースをみて、最小の数以外すべてとる戦法にこだわってしまった・・・。

CSACademy K Consequal

csacademy.com

<問題>
長さNの文字列が与えられます。
長さKの連続する部分文字列があるとき、それらを取り除きます。
以降、取り除かれた文字を繰り返し、操作ができなくなるまで取り除きます。
残った文字を出力してください。

<解説>
stackを使います。
stackに(文字、連続する回数)を詰めていき、
追加する文字が1つ前の元の同じかどうかで分岐していきます。
対応する括弧()系の文字と同様に、繰り返し取り除く系では典型??

<コード>

int main() {
	cin.tie(0);
	ios::sync_with_stdio(false);


	int n, k;
	cin >> n >> k;
	string s;
	cin >> s;
	if (k == 1) {
		P("");
		return 0;
	}
	
	stack<pair<char, int>> st;

	st.push(make_pair(s[0], 1));

	for (int i = 1; i < n; i++) {
		if (st.top().first == s[i] && st.top().second == k - 1) {
			st.pop();
		}
		else if (st.top().first == s[i]) {
			st.top().second++;
		}
		else {
			st.push(make_pair(s[i],1));
		}
	}

	string ans = "";
	while (!st.empty()) {
		rep(i, st.top().second)ans += st.top().first;
		st.pop();
	}
	reverse(ALL(ans));
	P(ans);
	return 0;
}

<感想>
上記のコードは出力時に反転させていますが、
公式解説のコードはdeckを使っていて、その処理を省いています。
そういう綺麗なコードを使いたい。

CSAcademy Win Percentages

csacademy.com

<問題>
2回にわけて同じゲームを行う。
はじめG_1回ゲームをしていて勝率P_1%だった。(P_1は少数以下切り捨て)
その後ゲームして、G_2回ゲーム(累計)をし勝率P_2%になった。(つまり、追加でG_2-G_1回ゲームをした結果勝率がP_2になった。)
追加ゲーム中に勝った数を最大にするとき、その回数はいくつか。

<解説>
勝率が小数点以下切り捨てなので、初回のゲームではP_1\%のまま、
2回目のゲーム後では(P_2+0.99999...)\%のようにすればよいです。
ゲーム回数は10^6であるため、初回、2回目の勝った回数を全探索し、上記の勝率になるように更新します。

その後追加のゲーム回数と比較し、どちらか小さいほうが答えになります。

<コード>

int main() {
	cin.tie(0);
	ios::sync_with_stdio(false);

	int g1, p1, g2, p2;
	cin >> g1 >> p1 >> g2 >> p2;

	int ans1 = 0;
	rep(i, g1 + 1) {
		if (i * 100 / g1 == p1) {
			ans1 = i;
			break;
		}
	}

	int ans2 = 0;
	rep(i, g2 + 1) {
		if (i * 100 / g2 == p2) {
			ans2 = i;
		}
	}
	P(min(g2-g1,ans2 - ans1));
	return 0;
}

<感想>
ここ最近の問題の中では一番易しい

CSAcademy Foxes on a Wheel

csacademy.com

<問題>
0~NN+1頂点をもつグラフがある。
頂点0は頂点1~Nと繋がっていて、
頂点  i (0\lt i \leq N) は頂点i-1,i+1とつながっている。
また、グラフは円状になっていて、頂点1と頂点Nはつながっている。

このグラフの頂点上に、K匹のキツネの居場所とK個の隠れ家が与えられる。
それぞれのキツネを隠れ家と対応させたとき、その距離の和が最小になる時の値はいくらか。

<解説>
出来る限り隣接しているキツネと家を割り当てて(距離1)
のこりは適当に割り当てます。(すべて距離2なので)
単純なループで割り当てればよいですが、
index1にキツネがいた際に、
家キツネ(index1)家キツネ
のような場合には、左のキツネは左の家をとるようにする必要があるため、
キツネ家キツネ(index1)家
の場合には右の家をとる必要があります。
そこで、頂点1で左右の場合分けを行います。

<コード>

int main() {

	int n, k;
	cin >> n >> k;

	vi f(n + 1), h(n + 1);
	rep(i, k) {
		int a;
		cin >> a;
		f[a] = 1;
	}
	rep(i, k) {
		int a;
		cin >> a;
		h[a] = 1;
	}

	int pair = 0;
	for (int i = 1; i < n; i++) {
		if ( (f[i] && h[i+1]) || (f[i+1] && h[i])) {
			i++;
			pair++;
		}
	}

	int pair2 = 0;
	if ((f[1] && h[n]) || (f[n] && h[1]))pair2++;
	for (int i = n - 1; i > 2; i--) {
		if ( (f[i] && h[i - 1]) || (f[i - 1] && h[i]) ) {
			i--;
			pair2++;
		}
	}

	P(2 * k - max(pair, pair2));
	return 0;
}

<感想>
×思考停止フロー流すだけ