zoukankan      html  css  js  c++  java
  • Codeforecs 65D. Harry Potter and the Sorting Hat 一种新的记忆化搜索方式

    D. Harry Potter and the Sorting Hat
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    As you know, Hogwarts has four houses: Gryffindor, Hufflepuff, Ravenclaw and Slytherin. The sorting of the first-years into houses is done by the Sorting Hat. The pupils are called one by one in the alphabetical order, each of them should put a hat on his head and, after some thought, the hat solemnly announces the name of the house the student should enter.

    At that the Hat is believed to base its considerations on the student's personal qualities: it sends the brave and noble ones to Gryffindor, the smart and shrewd ones — to Ravenclaw, the persistent and honest ones — to Hufflepuff and the clever and cunning ones — to Slytherin. However, a first year student Hermione Granger got very concerned about the forthcoming sorting. She studied all the literature on the Sorting Hat and came to the conclusion that it is much simpler than that. If the relatives of the student have already studied at Hogwarts, the hat puts the student to the same house, where his family used to study. In controversial situations, when the relatives studied in different houses or when they were all Muggles like Hermione's parents, then the Hat sorts the student to the house, to which the least number of first years has been sent at that moment. If there are several such houses, the choice is given to the student himself. Then the student can choose any of the houses, to which the least number of first years has been sent so far.

    Hermione has already asked the students that are on the list before her about their relatives. Now she and her new friends Harry Potter and Ron Weasley want to find out into what house the Hat will put Hermione.

    Input

    The first input line contains an integer n (1 ≤ n ≤ 10000). It is the number of students who are in the list before Hermione. The next line contains n symbols. If all the relatives of a student used to study in the same house, then the i-th character in the string coincides with the first letter of the name of this house. Otherwise, the i-th symbol is equal to "?".

    Output

    Print all the possible houses where Hermione can be sent. The names of the houses should be printed in the alphabetical order, one per line.

    Sample test(s)
    input
    11
    G????SS???H
    
    output
    Gryffindor
    Ravenclaw
    
    input
    2
    H?
    
    output
    Gryffindor
    Ravenclaw
    Slytherin
    
    Note

    Consider the second example. There are only two students before Hermione. The first student is sent to Hufflepuff. The second disciple is given the choice between the houses where the least number of students has been sent, i.e. Gryffindor, Slytherin and Ravenclaw. If he chooses Gryffindor, Hermione is forced to choose between Ravenclaw and Slytherin, if he chooses Ravenclaw, Hermione will choose between Gryffindor and Slytherin, if he chooses Slytherin, Hermione will choose between Gryffindor and Ravenclaw. In the end, the following situation is possible (it depends on the choice of the second student and Hermione). Hermione will end up 1) in Gryffindor, 2) in Ravenclaw, 3) in Slytherin. Note that, despite the fact that in neither case Hermione will be given a choice between all the three options, they are all possible and they should all be printed in the answer. Hermione will not, under any circumstances, end up in Hufflepuff.


    将4维参数压入一个vector中,利用set判断该状态是否出现过。

    #include <iostream>
    #include <string>
    #include <algorithm>
    
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <cstdlib>
    
    #include <map>
    #include <set>
    #include <vector>
    #include <queue>
    #include <stack>
    
    using namespace std;
    
    #define max_int       INT_MAX / 2
    #define max_long      0xFFFFFFFFFFFFFFFLL / 2
    #define two(a)        (1 << (a))
    #define eps           1e-6
    #define FF(i, a, b)   for (int i = (a); i <= (b); i++)
    #define FFD(i, a, b)  for (int i = (a); i >= (b); i--)
    
    const int OO=1e9;
    const int INF=1e9;
    int n;
    char s[11111];
    char name[4][50]={"Gryffindor","Hufflepuff","Ravenclaw","Slytherin"};
    
    set< vector<int> >vis;
    
    bool ans[5]={0};
    
    void dfs(int deep, vector<int>v )
    {
        if (vis.find(v)!=vis.end()) return;
        vis.insert(v);
        int min_s=*min_element(v.begin(),v.end());
        if (deep==n)
        {
            for (int i=0;i<4;i++)
            {
                if (v[i]==min_s)
                {
                    ans[i]=true;
                }
            }
        }
        else if (s[deep]=='?')
        {
            for (int i=0;i<4;i++)
            {
                if (v[i]==min_s)
                {
                    v[i]++;
                    dfs(deep+1,v);
                    v[i]--;
                }
            }
        }
        else
        {
            if (s[deep]=='G')
            {
                v[0]++;
                dfs(deep+1,v);
            }
            if (s[deep]=='H')
            {
                v[1]++;
                dfs(deep+1,v);
            }
            if (s[deep]=='R')
            {
                v[2]++;
                dfs(deep+1,v);
            }
            if (s[deep]=='S')
            {
                v[3]++;
                dfs(deep+1,v);
            }
        }
    }
    
    int main()
    {
        cin>>n;
        cin>>s;
        dfs(0,vector<int>(4,0));
        for (int i=0;i<4;i++)
        {
            if (ans[i])
            {
                cout<<name[i]<<endl;
            }
        }
        return 0;
    }
    



  • 相关阅读:
    jvisualvm工具使用
    Java四种引用包括强引用,软引用,弱引用,虚引用。
    <实战> 通过分析Heap Dump 来了解 Memory Leak ,Retained Heap,Shallow Heap
    什么是GC Roots
    Memory Analyzer tool(MAT)分析内存泄漏---理解Retained Heap、Shallow Heap、GC Root
    JDK自带工具之问题排查场景示例
    websocket协议握手详解
    ssh 登陆服务器原理
    新版本macos无法安装mysql-python包
    如何将多个小值存储进一个值中
  • 原文地址:https://www.cnblogs.com/cyendra/p/3038468.html
Copyright © 2011-2022 走看看