Codeforces Round #403 D. Innokenty and a Football League

题目链接:Codeforces Round #403 D. Innokenty and a Football League

题意:

某人需要给若干球队选择队名缩写。已知每个球队的名字必然是 <team name> <hometown name> 的形式。取队名缩写的规则是固定的,只有两种:

  1. 选择 team name 的前三个字母作为队名缩写
  2. 选择 team name 的前两个字母与 hometown name 的首字母组成队名缩写。

每个队的队名缩写都可以从两种中任选一种,问能够使得每个队最终的队名缩写均不同。

同时,题面中有额外要求,如果 x 的第一类队名缩写为 x.fst ,第二类队名缩写为 x.sec。若 x 选择了 x.sec 作为最终的队名缩写,那么其他队伍均不能以 y.fst 作为最终的队名缩写,如果 x.fst == y.fst 的话。当然,如果是 y.sec ==x.fst 的话,则不触发这一禁制规则。

题解:

我们先分析一下题意:只要x.fst == y.fst,那么x,y都只能选第二个名字。

所以我们就先预处理所有的第一个名字相等的名字,然后剩下的暴搜一下就行了。

只要搜出一种解马上就弹出,这样复杂度不会很大。

只跑了78ms

 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=a;i<=b;++i)
 3 using namespace std;
 4 
 5 const int N=1007;
 6 
 7 int n,vis[N],fg;
 8 char a[N],b[N],ans[N][6];
 9 struct dt
10 {
11     char a[5],b[5];
12     int idx;
13     bool operator <(const dt &bs)const
14     {
15         int tmp=strcmp(a,bs.a);
16         return tmp==0?strcmp(b,bs.b)<0:tmp<0;
17     }
18 }s[N];
19 map<string,int>mpall;
20 
21 void dfs(int i)
22 {
23     if(i==n+1)fg=1;
24     if(fg)return;
25     if(vis[i])dfs(i+1);
26     else
27     {
28         if(mpall[s[i].a])
29         {
30             if(mpall[s[i].b])return;
31             strcpy(ans[s[i].idx],s[i].b);
32             mpall[s[i].b]=1;
33             dfs(i+1);
34             mpall[s[i].b]=0;
35         }else
36         {
37             strcpy(ans[s[i].idx],s[i].a);
38             mpall[s[i].a]=1;
39             dfs(i+1);
40             if(fg)return;
41             mpall[s[i].a]=0;
42             if(mpall[s[i].b])return;
43             strcpy(ans[s[i].idx],s[i].b);
44             mpall[s[i].b]=1;
45             dfs(i+1);
46             mpall[s[i].b]=0;
47         }
48     }
49 }
50 
51 void work()
52 {
53     F(i,1,n)
54     {
55         if(strcmp(s[i].a,s[i-1].a)==0)
56         {
57             if(strcmp(s[i].b,s[i-1].b)==0)return;
58             vis[i]=vis[i-1]=1;
59             strcpy(ans[s[i].idx],s[i].b);
60             strcpy(ans[s[i-1].idx],s[i-1].b);
61             mpall[ans[s[i].idx]]=1;
62             mpall[ans[s[i-1].idx]]=1;
63         }
64     }
65     dfs(1);
66 }
67 
68 int main()
69 {
70     scanf("%d",&n);
71     F(i,1,n)
72     {
73         scanf("%s%s",a,b);
74         s[i].idx=i;
75         s[i].a[0]=s[i].b[0]=a[0];
76         s[i].a[1]=s[i].b[1]=a[1];
77         s[i].a[2]=a[2],s[i].b[2]=b[0];
78         s[i].a[3]=s[i].b[3]=0;
79     }
80     sort(s+1,s+1+n);
81     work();
82     if(fg==1)
83     {
84         puts("YES");
85         F(i,1,n)printf("%s
",ans[i]);
86     }else puts("NO");
87     return 0;
88 }
View Code
原文地址:https://www.cnblogs.com/bin-gege/p/6510880.html