Codeforces 체육관 100379 L 게임 문자열 게임 + 인 터 랙 션 문제

제목 의 대의:
26 개의 돌 이 있 습 니 다. 그 중 몇 개의 돌 을 골 라 서 선택 한 돌 중 하 나 를 가 져 갈 수 있 습 니 다. 가 져 갈 수 없 는 사람 은 실 패 했 습 니 다.너 는 선수 와 후 수 를 선택 한 후에 프로그램 과 상호작용 을 해서 필승 의 방안 을 제시 해 야 한다.
방법:
  • 우 리 는 먼저 한 무더기 의 상황 을 보 았 다. 만약 에 이 무더기 의 돌 수가 짝수 라면 선 수 는 반드시 지고, 반대로 홀수 라면 선 수 는 반드시 이긴다.
  • 우 리 는 26 더미 의 상황 까지 보급 할 수 있다. 만약 에 홀수 더미 의 돌 이 존재 하지 않 는 다 면 먼저 패 하고 그렇지 않 으 면 먼저 이 길 것 이다.
  • 이로써 우 리 는 가장 좋 은 방안 을 얻 었 다.만약 홀수 더미 의 돌 이 존재 하지 않 는 다 면 우 리 는 후 수 를 선택 하고 그렇지 않 으 면 선 수 를 선택한다.
  • 매번 홀수 더미 의 돌 을 가 져 가 상대방 이 필 패 상태 에 직면 하 게 하면 된다.

  • 코드:
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    char str[1000];
    set<int>s[26];
    int hand=2,oper[1000],os,ct;
    bool get()
    {
        int p;
        scanf("%d",&os);
        if(os==-1)return true;
        while(os--)
        {
            scanf("%d",&p);
            s[str[p-1]-'a'].erase(p);
        }
        return false;
    }
    int main()
    {
        scanf("%s",str);
        int len=strlen(str);
        for(int i=0;i'a'].insert(i+1);
        for(int i=0;i<26;i++)
            if(s[i].size()%2){hand=1;break;} //         
        printf("%d
    "
    ,hand); fflush(stdout); if(hand==2)get(); while(1){ int ct=0; for(int i=0;i<26;i++) if(s[i].size()%2) { oper[ct++]=*s[i].begin(); s[i].erase(s[i].begin()); // } printf("%d",ct); for(int i=0;iprintf(" %d",oper[i]); printf("
    "
    ); fflush(stdout); if(get())break; } return 0; }

    좋은 웹페이지 즐겨찾기