筆記試験問題-トランプの5つ以上の連続数値のカードの数を検索します
2633 ワード
タイトルの説明
大きさの王を含まない普通のトランプを仮定すると,A,2,3,4,5,6,7,8,9,10,J,Q,Kはそれぞれ1−13のトランプ数値を表す.網易内部では,順子が5個以上の連続数値のカードからなる新しい遊び方が開発された.A-2-3-4-5のように、8-9-10-J-Q-Kはいずれも定義に合致する順子であるが、10-J-Q-K-Aは定義に合致せず、順子ではない.
現在の手札を与えて、私たちは何種類の順子を共有する案を知りたいと思っています.異なるカード組成の同じ順子は、3 3 3 4 5 6 7のような異なるスキームと見なされ、2つの異なる(3,4,5,6,7)順子を構成することができる.
説明の入力
各入力データには、複数のテストポイントが含まれています.第1挙動試験点の個数T(T<=50).各試験点について、第1の挙動の整数N(0の次の行はN個の異なる数値(A,2,3,4,5,6,7,8,9,10,J,Q,Kで表される)を含み、手札の数値を表す.同じ数値が4回を超えないことを保証します.
出力の説明
各テストポイントについて、可能な順子スキーム数を出力します.
問題を解く構想.
長さ13の配列を確立し,A,2,3,4,5,6,7,8,9,10,J,Q,Kの出現回数を保存した.連続長が5以上の最上位シーケンスの開始位置と終了位置を配列内で検索します.開始位置から終了位置までのシナリオ数を計算します.
お父さんの所
上記のコードは、ローカルデバッグ時に与えられたテストサンプルは完全に合格したが、アップロードされたコードの通過率はゼロだった(入力の制限条件を追加しなかったから?愚か..).ローカルで考えられるテストサンプルはすべて試したが、問題は発見されなかった.テストミスの例を見つけたら、この解法がどこで間違っているのか教えてください.
大きさの王を含まない普通のトランプを仮定すると,A,2,3,4,5,6,7,8,9,10,J,Q,Kはそれぞれ1−13のトランプ数値を表す.網易内部では,順子が5個以上の連続数値のカードからなる新しい遊び方が開発された.A-2-3-4-5のように、8-9-10-J-Q-Kはいずれも定義に合致する順子であるが、10-J-Q-K-Aは定義に合致せず、順子ではない.
現在の手札を与えて、私たちは何種類の順子を共有する案を知りたいと思っています.異なるカード組成の同じ順子は、3 3 3 4 5 6 7のような異なるスキームと見なされ、2つの異なる(3,4,5,6,7)順子を構成することができる.
説明の入力
各入力データには、複数のテストポイントが含まれています.第1挙動試験点の個数T(T<=50).各試験点について、第1の挙動の整数N(0の次の行はN個の異なる数値(A,2,3,4,5,6,7,8,9,10,J,Q,Kで表される)を含み、手札の数値を表す.同じ数値が4回を超えないことを保証します.
出力の説明
各テストポイントについて、可能な順子スキーム数を出力します.
問題を解く構想.
長さ13の配列を確立し,A,2,3,4,5,6,7,8,9,10,J,Q,Kの出現回数を保存した.連続長が5以上の最上位シーケンスの開始位置と終了位置を配列内で検索します.開始位置から終了位置までのシナリオ数を計算します.
#include
#include
#include
using namespace std;
int factor(int begin, int end, int a[])
{
int ret = 1;
for (int i = begin; i <= end; i++){
ret = ret * a[i];
}
return ret;
}
int searchCnt(int begin, int end, int a[])
{
int ret = factor(begin, end, a);
int len = end - begin + 1;
for (int i = 5; i < len; i++){
for (int j = 0; j <= len - 5; j++){
ret = ret + factor(begin + j, begin + i + j - 1, a);
}
}
return ret;
}
bool isShunzi(int& begin, int& end, int& len, bool& flag, int a[])
{
bool endFlag = false;
len = 0;
for (int k = 0; k < 13; k++){
if (a[k] != 0){
if (len == 0) begin = k;
len++;
}
else{
if (len >= 5){
end = k - 1;
flag = true;
break;
}
len = 0;
}
if (k == 12) endFlag = true;
}
return endFlag;
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
int len;
cin >> len;
string tmp;
int count[13] = { 0 };
for (int j = 0; j < len; j++){
cin >> tmp;
if (tmp == "A") count[0]++;
else if (tmp == "10") count[9]++;
else if (tmp == "J") count[10]++;
else if (tmp == "Q") count[11]++;
else if (tmp == "K") count[12]++;
else if ("2" <= tmp && tmp <= "9") count[tmp[0] - '1']++;
else{
cout << "paraneter is invalid ..." << endl;
}
}
int ret = 0;
int length = 0, begin = 0, end = 0;
bool flag = false, endFlag = false;
while (!isShunzi(begin, end, length, endFlag, count))
{
ret = searchCnt(begin, end, count);
begin = end + 1;
length = 0;
if (endFlag) break;
}
cout << ret << endl;
}
return 0;
}
お父さんの所
上記のコードは、ローカルデバッグ時に与えられたテストサンプルは完全に合格したが、アップロードされたコードの通過率はゼロだった(入力の制限条件を追加しなかったから?愚か..).ローカルで考えられるテストサンプルはすべて試したが、問題は発見されなかった.テストミスの例を見つけたら、この解法がどこで間違っているのか教えてください.