ryopper777
@ryopper777 (Ryosuke Kawata)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

AtCoder ABC 263 A問題

AtCoder ABC 263 A問題

入力に対して、ソートして、下から3つ+上から2つが等しいか、下から2つ+上から3つが等しいとすればできると思ったのですが、”1 1 2 2 2”という入力に対して、"No"と判定されてしまいます。

該当するソースコード

#include<bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main(){
  vector<int> vec(5);
  rep(i,5) cin >> vec.at(i);
  sort(vec.begin(), vec.end());
  //cout << vec.at(0) << vec.at(1) << vec.at(2) << vec.at(3) << vec.at(4) << endl;
  if(vec.at(0) == vec.at(1) == vec.at(2) && vec.at(3) == vec.at(4)) cout << "Yes" << endl;
  else if(vec.at(0) == vec.at(1) && vec.at(2) == vec.at(3) == vec.at(4)) cout << "Yes" << endl;
  else cout << "No" << endl;
  return 0;
}

よろしくお願いします。

0

2Answer

C++における条件式では3つを評価させる際に

A == B == C

などという表記をすると,左から順に評価され,AとBが等しければTrueすなわち1になり

1 == C

という式が次に評価されることになります.したがって,A = BかつC = 1であって今回の問題であり得そうな入力例1である1 1 1 2 21 1 1 3 3ではYesと出ますが他のフルハウスは全てNoになります.

したがって,ryopper777さんが実現したい比較条件を記述するには

A == B && B == C

と書かなければなりません.

冒頭でC++におけると書き始めたのは,Python3等の他の言語であればA == B == Cの動作において,3項が等しいことを演算してくれる言語もあるためです.

  1. 今回,入力の範囲に0がないのですが,もし0を含む場合,0 0 1 2 2Yesです.小さい順からABCDEとなっているとして,A = BかつC = 1ですからね.False0に相当するため,負の入力値も許されているのであれば-1 0 0 2 2Yesになります.A != BかつC = 0が成り立つのでTrueです.

0Like

Comments

  1. @ryopper777

    Questioner

    @PondVillegeさん、ありがとうございます!
    c++だと、pythonのようなa == b == cが使えないんですね、
    自分だけではこのエラーから抜け出せなかったので、助かりました!ありがとうございます。
    c++のa == b == cの挙動についても、解説いただき、ありがとうございました。非常に参考になります!

参考までに,公式解と別の解を示しておきます.

#include <iostream>
#include <map>
#define rep(i,n) for(int i=0;i<n;++i)

using namespace std;

int main() {
	map<int, int> m;
	rep(i, 5) {
		int a; cin >> a;
		m[a]++;
	}
	for (const auto [k, v]: m) if (v == 1) {
		cout << "No\n";
		return 0;
	}
	cout << "Yes\n";
	return 0;
}

原理は,mapを用いて数の種類とサイズを求めるようにし,そのサイズのうち1があればNo,その他はYesを出すというものです.

5枚のカードのうち同じ数字で種類分けをしたサイズでカテゴライズすると

  • (1, 1, 1, 1, 1): 全部違う数字,すなわちノーペアorストレート
  • (5): 全部同じ数字,今回の入力条件上存在しない
  • (1, 4): フォーカード
  • (1, 1, 3): スリーカード
  • (1, 1, 1, 2): ワンペア
  • (2, 3): フルハウス

になります.存在しないやつを除けば,必ず種類のサイズに1が入っているものはNoと出すべき役になります.したがって上のコードでやればACとなるわけです.

A問題如きにこの思考量を割くべきか,思いついたコードを書くことに時間を割くべきかは人によると思いますので,あくまで参考までに.

0Like

Comments

  1. @ryopper777

    Questioner

    @PondVillegeさん、ありがとうございます。
    面白いですね!全部同じ数字が入力条件上存在しないから使える解法なんですね。
    まだmapをうまく使いこなせていないので、使いこなせるようになりたいです!
  2. 全部同じ数字が入力条件上存在していても,m.size()が1であれば1種類しか存在しないということになるので,ここでNoを出すという処理が増えるだけになります.
    mapをうまく使いこなせるようになると1段階レベルアップですね,ぜひ頑張ってください.
  3. @ryopper777

    Questioner

    @PondVillegeさん、
    ご丁寧に解説ありがとうございました!!頑張りたいと思います💪

Your answer might help someone💌