题目链接:Codeforces Round #403 D. Innokenty and a Football League
题意:
某人需要给若干球队选择队名缩写。已知每个球队的名字必然是 <team name> <hometown name>
的形式。取队名缩写的规则是固定的,只有两种:
- 选择
team name
的前三个字母作为队名缩写 - 选择
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\n",ans[i]); 86 }else puts("NO"); 87 return 0; 88 }
时间: 2024-10-18 08:45:02