[NKU]sweet @ Google && TopCoder && CodeForces

            BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
            33 Posts :: 1 Stories :: 15 Comments :: 0 Trackbacks
          題意很簡(jiǎn)單……雙方給N個(gè)人(N<=6)打三國(guó)殺1V1,你知道對(duì)手每個(gè)人能克制你哪些人,我們認(rèn)為兩個(gè)人對(duì)打,他能克你則他勝利,否則你勝利;某人的N個(gè)人死光就輸了……你需要組織陣容按照順序?qū)箤?duì)手……求有沒(méi)有一個(gè)順序,無(wú)論對(duì)手順序如何,你都能勝……
          N!枚舉自己的順序,然后N!枚舉對(duì)方的順序,O(N)驗(yàn)證即可……
          注意字典序最小……

           1 #include <cstdio>
           2 #include <cstring>
           3 #include <string>
           4 #include <map>
           5 #include <algorithm>
           6 #include <iostream>
           7 
           8 using namespace std;
           9 
          10 map<string,int> mp;
          11 int n;
          12 int res[10];
          13 int my[10];
          14 char buf[50];
          15 char name[10][50];
          16 string ans;
          17 
          18 void check() {
          19     int enemy[] = {0,1,2,3,4,5,6,7,8,9};
          20     do {
          21         int i = 0;
          22         int j = 0;
          23         while (i < n && j < n) {
          24             if ((1 << my[i]) & res[enemy[j]]) i ++else j++;
          25         }
          26         if (i == n) return;
          27     } while (next_permutation(enemy,enemy + n));
          28     string tmp;
          29     for (int i = 0; i < n; i++) {
          30         if (i) tmp += " ";
          31         tmp += name[my[i]];
          32     }
          33     if (ans == "" || ans > tmp) ans = tmp;
          34 }
          35 
          36 int main() {
          37     int nn; scanf("%d",&nn);
          38     for (int ii = 1; ii <= nn; ii++) {
          39         mp.clear();
          40         memset(res,0,sizeof(res));
          41         scanf("%d",&n);
          42         for (int i = 0; i < n; i++) {
          43             scanf("%s",name[i]);
          44             mp[string(name[i])] = i;
          45         }
          46         for (int i = 0; i < n; i++) {
          47             int m; scanf("%d",&m);
          48             for (int j = 0; j < m; j++) {
          49                 scanf("%s",buf);
          50                 int tmp = mp[string(buf)];
          51                 res[i] |= 1 << tmp;
          52             }
          53         }
          54         for (int i = 0; i < n; i++) {
          55             my[i] = i;
          56         }
          57         ans = "";
          58         do {
          59             check();
          60         } while (next_permutation(my,my + n));
          61         printf("Case %d: ",ii);
          62         if (ans == "") {
          63             puts("No");
          64         } else {
          65             puts("Yes");
          66             for (int i = 0; i < ans.length(); i++) putchar(ans[i]);
          67             putchar(10);
          68         }
          69     }
          70     return 0;
          71 }
          posted on 2011-10-07 20:15 sweetsc 閱讀(630) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): ACM/ICPC
          主站蜘蛛池模板: 惠安县| 静宁县| 建瓯市| 石城县| 郁南县| 青冈县| 新野县| 广丰县| 合作市| 屏东县| 田阳县| 彭山县| 泽普县| 太保市| 南投市| 尖扎县| 尼木县| 大足县| 五莲县| 安乡县| 南丰县| 富锦市| 阿合奇县| 根河市| 资阳市| 临沭县| 温泉县| 开平市| 甘孜| 曲阜市| 晋州市| 招远市| 云南省| 锦州市| 广饶县| 长岛县| 东源县| 剑阁县| 道真| 静海县| 和政县|