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\n",ans[i]);
86     }else puts("NO");
87     return 0;
88 }

时间: 2024-10-18 08:45:02

Codeforces Round #403 D. Innokenty and a Football League的相关文章

Codeforces Round #403 div2 C. Andryusha and Colored Balloons

题目链接:Codeforces Round #403 div2 C. Andryusha and Colored Balloons 题意: 给你一棵n个节点的树,然后让你染色,规定相连的三个 节点不能同色,问需要的最少颜色,并输出其中一种方案. 题解: 因为只有相邻3个节点不同色. 所以直接DFS,每个节点都从1开始. 然后ans[v]!=ans[u]!=ans[fa]就行. 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i&

Codeforces Round #403 (Div. 1, based on Technocup 2017 Finals)

Div1单场我从来就没上过分,这场又剧毒,半天才打出B,C挂了好几次最后还FST了,回紫了. AC:AB Rank:340 Rating:2204-71->2133 Div2.B.The Meeting Place Cannot Be Changed 题目大意:n个人,第i个人位于xi,速度为vi,找到一个点使得所有人到这个点的耗时最小,输出耗时.(n<=60000) 思路:二分答案,知道耗时后可以求出每个人能到达的区间,如果所有区间有交则合法,复杂度O(nlog). #include<

D. Innokenty and a Football League

Innokenty is a president of a new football league in Byteland. The first task he should do is to assign short names to all clubs to be shown on TV next to the score. Of course, the short names should be distinct, and Innokenty wants that all short na

Codeforces Round #403(div 2)

A =w= B 题意:一个数轴上有n个整点,每个点都有一个速度,选一个点让他们集合,使得时间最少. 分析: 直接三分 C 题意:给定一棵树,任意两个距离小等于二的点不能染相同的颜色,求最小颜色数和染色方案. n<=2*10^5 分析: 容易知道答案就是最大的度数+1 至于方案直接暴搜出方案就行 D 题意:有n个足球队,每个队有两个选名字的方案,也就是直接给定了两个名字.所有球队不能有相同的名字.特殊的,如果有两个球队第一个名字相同,一个球队选了第二个名字,另一个球队不能选第一个名字.n<=10

Codeforces Round #403 (Div. 2)解题报告

A. 1 #include <iostream> 2 #include<bits/stdc++.h> 3 #include <stack> 4 #include <queue> 5 #include <map> 6 #include <set> 7 #include <cstdio> 8 #include <cstring> 9 #include <algorithm> 10 #include &l

Codeforces Round #403

C. Andryusha and Colored Balloons time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Andryusha goes through a park each day. The squares and paths between them look boring to Andryusha, so he

Codeforces Round #592 (Div. 2) C - The Football Season(推公式)

?? ?? ?? 题意加题解: //x*w+y*d=p; //x+y+z=0 int main() { ll n,p,w,d; cin>>n>>p>>w>>d; ll y=0; while(y<w&&(p-d*y)%w) ++y; if(y==w) return puts("-1"),0; ll x=(p-d*y)/w; if(x<0||x+y>n) return puts("-1")

Codeforces Round #246 (Div. 2) B. Football Kit

题目的意思是求出每个队穿主场衣服和客场衣服的次数 每个队作为主场的次数是n-1,作为客场的次数是n-1 当每个队打主场的时候肯定穿的主场衣服 当每个队打客场时,如果客场与主场的衣服不同,则穿客场衣服   如果客场与主场的衣服相同,则穿主场衣服 则只需要标记主场每种衣服有多少球队,当作为客场时查找与客场颜色相同的主场球队有多少即可 #include <iostream> #include <map> #include <vector> #include <algor

Codeforces Round #279 (Div. 2) ABCD

Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name     A Team Olympiad standard input/output 1 s, 256 MB  x2377 B Queue standard input/output 2 s, 256 MB  x1250 C Hacking Cypher standard input/output 1 s, 256 MB  x740 D Chocolate standard input/