JakeLin- [ACMトレーニング]興味深いゲームの問題/理解しやすい

タイトル説明
パーティーメンバーの課外生活を充実させるために、アカデミーは強い国の知識を学ぶコンテストを組織しました。コンテストの採点ルールは、各プレーヤーに10点の開始スコアがあり、コンテストの参加者が10の質問(1〜10の番号が付けられている)に回答する必要があることです。 、正解です。現在のスコアが2倍になり、間違っている場合は、同じ質問番号のスコアが差し引かれます。

入力

最初の行には整数M(1 <= M <100)があり、Mセットのテストデータがあることを意味します。次に、各行にスコアスコア(0≤score≤100)が入ります。

アウトプット

観戦していないと仮定し、スコアごとに状況の数を出力し、状況がなければ-1を出力してください。(ヒント:0がプレイヤーの間違った質問を表し、1がプレイヤーの正しい質問を表し、プレイヤーの最終スコアが90の場合、次の2つの状況が
考え
られます1110000010 0001110110)

入力例


68
63
100

出力例

7
-1

元のタイトルリンク:面白いゲーム

 

観察:

0000000000-> 0
0000000001-> 1
0000000010-> 2

1111111111-> 1023


見つかった:

すべてのケースを取得し、各ケースが入力されたスコアを満たすかどうかを判断するには、0〜1023をトラバースするだけです。


あなたが必要:

  • 1. 10進数を2進数に把握します(毎回%2)。
  • 2.正面の空席を0で埋める必要があります(全体が0に設定され、背面から%2を挿入した結果)
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main() {
    int m;
    cin>>m;
    int a[10];
    while(m--) {
        int score;
        cin>>score;
        int cnt=0;
        for(int i=0; i<=1023; i++) {
            memset(a,0,sizeof(a));
            int p=9;
            int t=i;
            while(t) {
                a[p--]=t%2;
                t/=2;
            }
            int s = 10;
            for(int j=0; j<10; j++) {
                if(a[j]==0) s-=(j+1);
                else s*=2;
            }
            if(score==s) cnt++;
        }
        if(cnt==0) cout<<-1<<endl;
        else cout<<cnt<<endl;
    }
    return 0;
}

 

 

元の記事を20件公開 15 獲得 ビュー216

おすすめ

転載: blog.csdn.net/qq_37414463/article/details/105388165