[プログラマー]偽装


問題の概要

  • スパイは、1つの部位で服を羽織るか、羽織らないことができる.
  • 着の衣類の個数は[1,30]、1着の衣類の個数は[衣類名、部位]である.
  • スパイは少なくとも1枚以上の服を着なければならない(ゲームのアイコンははははは...基本的には帽子を1枚しかかぶっていない)
  • すくい取る


  • 普通の地図で実現し、無秩序な地図に変えます.最初はで部分的にクローゼットを作り、クローゼットには服の名前が格納されていた.その後、無秩序mapは各部分の衣類数のみを格納する.

  • タイムアウト
    最初に「着る部分を選ぶ」というプロセスが加わった.
    だからPartsu C 1 Partsu C 2...各パズル数Cパズル数について、着用可能な指数は乗算(選択されたパズル数の種類数の積)である.
  • c++のnext permutation()で着る部分を選択し、1番台でタイムアウトしました.質問欄を見ることで、高校生たちは「骨を落とす」問題を解決することができる.
    (帽子数+1)*(化粧数+1)*(Tシャツ数+1)...(靴数+1)-1
    使えます.
    各積ブロックにおいて、+1は、着用しないことを選択できることを示す.
    最後に1を外すのは何も着ていない場合を除きます.
    実際,これはハッシュ問題よりも組合せ問題のように見える.

    コード#コード#

    #include <string>
    #include <vector>
    #include<unordered_map>
    #include<iostream>
    #include<set>
    #include<algorithm>
    using namespace std;
    
    int solution(vector<vector<string>> clothes) {
        int answer = 0;
        unordered_map<string,int> m;
        for(int i = 0;i<clothes.size();i++){
            unordered_map<string,int>::iterator it = m.find(clothes[i][1]);
            if(it == m.end()){
                m.insert({clothes[i][1],1});
            }
            else{
                it->second++;
            }
        }
        int n_parts = m.size();
        cout<<n_parts<<endl;//nparts c1 2 3..nparts
        vector<int> sz_arr;
        answer = 1;
        for(unordered_map<string, int>::iterator it = m.begin();it!=m.end();it++){
            sz_arr.push_back(it->second);
            answer*=it->second+1;
            cout<<it->second+1<<" ";
        }
        cout<<"done print"<<endl;
        answer-=1;
    
        return answer;
    }