Codeforces Round #394 (Div. 2)

  A题,水题,但是需要特判"0 0"因为至少至少走了一格= =。

  B题,水题,但是补题的时候n=1的情况没考虑(或者说写挫了)导致WA了一发。

  C题,数据小,可以直接暴力,用3个数组分别储存每一行变成3种类型的字符需要移动的最少位置。然后三个for来暴力枚举分别由这3行提供3种字符,更新答案即可。代码如下:

 1 #include <stdio.h>
 2 #include <algorithm>
 3 #include <string.h>
 4 #include <iostream>
 5 #include <map>
 6 using namespace std;
 7 const int N = 55;
 8 
 9 char s[N][N];
10 int cnt[5];
11 int get(char c)
12 {
13     if(c>='0' && c<='9') return 1;
14     if(c>='a' && c<='z') return 2;
15     return 3;
16 }
17 int a[N],b[N],c[N];
18 
19 int main()
20 {
21     int n,m;
22     cin >> n >> m;
23     for(int i=1;i<=n;i++)
24     {
25         scanf("%s",s[i]+1);
26         a[i] = b[i] = c[i] = 1000;
27         for(int j=1;j<=m;j++)
28         {
29             int now = get(s[i][j]);
30             if(now == 1) a[i] = min(a[i], min(j-1, m-(j-1)));
31             if(now == 2) b[i] = min(b[i], min(j-1, m-(j-1)));
32             if(now == 3) c[i] = min(c[i], min(j-1, m-(j-1)));
33         }
34     }
35     int ans = 1000;
36     for(int i=1;i<=n;i++)
37     {
38         for(int j=1;j<=n;j++)
39         {
40             for(int k=1;k<=n;k++)
41             {
42                 if(i==j || i==k || j==k) continue;
43                 ans = min(ans, a[i]+b[j]+c[k]);
44             }
45         }
46     }
47     cout << ans << endl;
48     return 0;
49 }
C

  D题,水题。排序一下乱搞即可。

  E题,很有意思的题目。要注意的是dirx和diry数组必须按照顺序排好。详见代码:

 1 #include <stdio.h>
 2 #include <algorithm>
 3 #include <string.h>
 4 #include <iostream>
 5 #include <vector>
 6 using namespace std;
 7 const int N = 100000 + 5;
 8 typedef long long ll;
 9 
10 int dirx[] = {0,-1,0,1};
11 int diry[] = {1,0,-1,0};
12 ll x[50],y[50];
13 vector<int> G[50];
14 void dfs(int u,int fa,ll now,int dir)
15 {
16     for(int i=0;i<G[u].size();i++)
17     {
18         int v = G[u][i];
19         if(v == fa) continue;
20         int k;
21         for(k=0;k<4;k++)
22         {
23             if((dir & (1<<k)) == 0)
24             {
25                 dir |= (1<<k);
26                 break;
27             }
28         }
29         x[v] = x[u] + dirx[k] * now;
30         y[v] = y[u] + diry[k] * now;
31         dfs(v,u,now>>2,1<<(k+2)%4);
32     }
33 }
34 
35 int main()
36 {
37     int n;
38     scanf("%d",&n);
39     for(int i=1;i<n;i++)
40     {
41         int u,v; scanf("%d%d",&u,&v);
42         G[u].push_back(v);
43         G[v].push_back(u);
44     }
45     for(int i=1;i<=n;i++) if(G[i].size() > 4) return 0*puts("NO");
46     puts("YES");
47     dfs(1,-1,1LL<<58,0);
48     for(int i=1;i<=n;i++) printf("%I64d %I64d
",x[i],y[i]);
49     return 0;
50 }
E
原文地址:https://www.cnblogs.com/zzyDS/p/6365697.html