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

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            33 Posts :: 1 Stories :: 15 Comments :: 0 Trackbacks
          題意很簡單……雙方給N個人(N<=6)打三國殺1V1,你知道對手每個人能克制你哪些人,我們認為兩個人對打,他能克你則他勝利,否則你勝利;某人的N個人死光就輸了……你需要組織陣容按照順序對抗對手……求有沒有一個順序,無論對手順序如何,你都能勝……
          N!枚舉自己的順序,然后N!枚舉對方的順序,O(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 閱讀(625) 評論(0)  編輯  收藏 所屬分類: ACM/ICPC
          主站蜘蛛池模板: 鞍山市| 定兴县| 普格县| 多伦县| 白河县| 左贡县| 石城县| 泸州市| 长顺县| 晋江市| 昌邑市| 牟定县| 永年县| 柳河县| 青田县| 广州市| 樟树市| 桃源县| 金乡县| 澄江县| 平顶山市| 黄骅市| 巴楚县| 盐源县| 肇源县| 安溪县| 白银市| 黄冈市| 安新县| 南部县| 广西| 雅江县| 油尖旺区| 潞西市| 金平| 奉贤区| 嘉兴市| 隆安县| 临高县| 石河子市| 吴忠市|