The 2018 ACM-ICPC Asia Beijing Regional Contest

http://hihocoder.com/problemset/problem/

#1870 : Jin Yong’s Wukong Ranking List

我是每加1个点就dfs判断1次。

正解是拓扑排序。。。

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <ctime>
 4 #include <cstring>
 5 #include <string>
 6 #include <map>
 7 #include <set>
 8 #include <list>
 9 #include <queue>
10 #include <vector>
11 #include <bitset>
12 #include <algorithm>
13 #include <iostream>
14 using namespace std;
15 const int maxn=50;
16 
17 bool vis[maxn];
18 char str[maxn][maxn],a[maxn],b[maxn],result1[maxn],result2[maxn];
19 vector<int>e[maxn];
20 int r;
21 
22 void dfs(int d)
23 {
24     vector<int>::iterator j;
25     vis[d]=1;
26     for (j=e[d].begin();j!=e[d].end();j++)
27         if (!vis[*j])
28             dfs(*j);
29         else
30         {
31             r=1;
32             return;
33         }
34 }
35 
36 int main()
37 {
38     int n,i,j,k,g;
39     while (~scanf("%d",&n))
40     {
41         for (i=1;i<=2*n;i++)
42             e[i].clear();
43         g=0;
44         r=0;
45         for (i=1;i<=n;i++)
46         {
47             scanf("%s%s",a,b);
48             for (j=1;j<=g;j++)
49                 if (strcmp(str[j],a)==0)
50                     break;
51             if (j==g+1)
52             {
53                 g++;
54                 strcpy(str[g],a);
55             }
56 
57             for (k=1;k<=g;k++)
58                 if (strcmp(str[k],b)==0)
59                     break;
60             if (k==g+1)
61             {
62                 g++;
63                 strcpy(str[g],b);
64             }
65 
66             e[j].push_back(k);
67 
68             memset(vis,0,sizeof(vis));
69             if (r==0)
70             {
71                 dfs(k);
72                 if (r==1)
73                 {
74                     strcpy(result1,a);
75                     strcpy(result2,b);
76                 }
77             }
78         }
79 
80         if (r==0)
81             printf("0\n");
82         else
83             printf("%s %s\n",result1,result2);
84     }
85     return 0;
86 }

#1871 : Heshen's Account Book

把所有内容放入字符串里,再判断。

挺多细节要考虑的,代码下方有自己编的若干数据。

  1 #include <cstdio>
  2 #include <cstdlib>
  3 #include <ctime>
  4 #include <cstring>
  5 #include <string>
  6 #include <map>
  7 #include <set>
  8 #include <list>
  9 #include <queue>
 10 #include <vector>
 11 #include <bitset>
 12 #include <algorithm>
 13 #include <iostream>
 14 using namespace std;
 15 const int maxn=2e5;
 16 const int maxsinlen=20;
 17 const int maxlen=1e3+10;
 18 const int maxtotallen=3e5;
 19 const int maxline=2e2+10;
 20 
 21 char num[maxn][maxsinlen];
 22 char str[maxtotallen],s[maxlen],c;
 23 int gx[maxline];
 24 
 25 int main()
 26 {
 27     int g=0,len,line=0,ind=0,pos=0,i,j,k;
 28     bool vis=1;
 29     strcpy(str,"");
 30     while (gets(s))
 31     {
 32         strcat(str,s);
 33         strcat(str,"\n");
 34     }
 35     len=strlen(str);
 36 
 37     for (i=0;i<len;i++)
 38     {
 39         if (str[i]=='\n')
 40         {
 41             line++;
 42             if (i==0 || str[i-1]<'0' || str[i-1]>'9' || str[i+1]<'0' || str[i+1]>'9')
 43             {
 44                 if (vis && i>ind)
 45                 {
 46 //                    strncpy(num[g++],str+ind,i-ind);
 47                     ///delete ' ','\n'
 48                     k=0;
 49                     for (j=ind;j<i;j++)
 50                         if (str[j]>='0' && str[j]<='9')
 51                             num[g][k++]=str[j];
 52                     num[g][k]=0;
 53                     if (!(k>1 && num[g][0]=='0'))
 54                     {
 55                         g++;
 56                         gx[pos]++;
 57                     }
 58                 }
 59                 vis=1;
 60                 ind=i+1;
 61                 pos=line;
 62             }
 63         }
 64         else if (str[i]==' ')
 65         {
 66             if (vis && i>ind)
 67             {
 68 //                strncpy(num[g++],str+ind,i-ind);
 69                 ///delete ' ','\n'
 70                 k=0;
 71                 for (j=ind;j<i;j++)
 72                     if (str[j]>='0' && str[j]<='9')
 73                         num[g][k++]=str[j];
 74                 num[g][k]=0;
 75                 if (!(k>1 && num[g][0]=='0'))
 76                 {
 77                     g++;
 78                     gx[pos]++;
 79                 }
 80             }
 81             vis=1;
 82             ind=i+1;
 83             pos=line;
 84         }
 85         else
 86         {
 87             if (str[i]<'0' || str[i]>'9')
 88                 vis=0;
 89         }
 90     }
 91 
 92     if (g>=1)
 93         printf("%s",num[0]);
 94     for (i=1;i<g;i++)
 95         printf(" %s",num[i]);
 96     printf("\n");
 97 
 98     for (i=0;i<line;i++)
 99         printf("%d\n",gx[i]);
100     return 0;
101 }
102 /**
103 12
104 34
105 56
106 78
107 900
108 
109 ---
110 
111 003
112 004
113 005
114 1 006 a
115 
116 ---
117 '''
118 
119 23 123
120   123 123
121 
122 
123 
124 adssa q3qe
125 qw 1
126 qw123
127 12
128 
129 
130 '''
131 
132 ---
133 
134 1234
135  123
136 
137 ---
138 
139 1234
140   12    34
141 
142 ---
143 
144 
145 1
146 
147 2
148 
149 3
150 
151 as
152 
153 4
154 
155 ---
156 
157 12
158 3
159 4
160 5a
161 
162 
163 
164 ---
165 
166 00
167 
168 ---
169 
170 0
171 
172 ---
173 
174 0
175 12
176 
177 ---
178 
179 0
180 12asdb
181 
182 ---
183 
184 '''
185 0
186 a
187 0 0    0   0
188 
189 12 0  01 100  10 01 0
190 0
191 
192 '''
193 
194 **/

#1873 : Frog and Portal

重现赛时,看错题了,难受。

告诫自己:比赛时,一定要认真读题,认真分析数据!

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <ctime>
 4 #include <cstring>
 5 #include <string>
 6 #include <map>
 7 #include <set>
 8 #include <list>
 9 #include <queue>
10 #include <vector>
11 #include <bitset>
12 #include <algorithm>
13 #include <iostream>
14 using namespace std;
15 #define ll long long
16 const int maxn=1e3+10;
17 
18 struct node
19 {
20     int x,y;
21 }f[300];
22 
23 int shu[300],w;
24 
25 void cal(ll n)
26 {
27     if (n==0)
28         w=0;
29     else
30     {
31         cal(n>>1);
32         shu[++w]=n & 1;
33     }
34 }
35 
36 int main()
37 {
38     ll n;
39     int g,i,j,k;
40     while (~scanf("%lld",&n))
41     {
42         w=0;
43         cal(n);
44 
45         g=0;
46         j=1;
47         k=70;
48 
49         for (i=2;i<=w;i++)
50         {
51             ///(k+1)->(k+2)
52             f[++g]={k+1,k+2};
53             if (shu[i])
54             {
55                 f[++g]={j,k+2};
56                 j+=2;
57             }
58             k+=2;
59         }
60         f[++g]={k,199};
61         f[++g]={j,70};
62         f[++g]={j+1,j+1};
63         if (n==0)
64             f[++g]={199,199};
65 
66         printf("%d\n",g);
67         for (i=1;i<=g;i++)
68             printf("%d %d\n",f[i].x,f[i].y);
69     }
70     return 0;
71 }
72 /*
73 0
74 1
75 2
76 3
77 4
78 
79 4294967296
80 4294967295
81 4294967294
82 
83 */

#1878 : Palindromes

找规律。

Java TLE了,难受!

关于字符串的处理,以后别用Java写。。。

  1 #include <cstdio>
  2 #include <cstdlib>
  3 #include <ctime>
  4 #include <cstring>
  5 #include <string>
  6 #include <map>
  7 #include <set>
  8 #include <list>
  9 #include <queue>
 10 #include <vector>
 11 #include <bitset>
 12 #include <algorithm>
 13 #include <iostream>
 14 using namespace std;
 15 const int maxn=1e6+10;
 16 
 17 int shu[maxn],ori[maxn];
 18 char str[maxn];
 19 
 20 int main()
 21 {
 22     int t,len,i;
 23     scanf("%d",&t);
 24     while (t--)
 25     {
 26         scanf("%s",str);
 27         len=strlen(str);
 28         for (i=1;i<=len;i++)
 29             shu[i]=str[len-i]-48;
 30         if (str[0]>'1')
 31         {
 32             ///odd
 33             for (i=1;i<=len-1;i++)
 34                 ori[i]=0;
 35             ori[len]=2;
 36 
 37             for (i=1;i<=len;i++)
 38             {
 39                 shu[i]-=ori[i];
 40                 if (shu[i]<0)
 41                 {
 42                     shu[i]+=10;
 43                     shu[i+1]--;
 44                 }
 45             }
 46 
 47             printf("%c",shu[len]+1+48);
 48             for (i=len-1;i>=1;i--)
 49                 printf("%c",shu[i]+48);
 50             if (len>1)
 51             {
 52                 for (i=2;i<=len-1;i++)
 53                     printf("%c",shu[i]+48);
 54                 printf("%c",shu[len]+1+48);
 55             }
 56             printf("\n");
 57         }
 58         else if (len==1)
 59             printf("0\n");
 60         else if (str[1]=='0')
 61         {
 62             ///odd
 63             for (i=1;i<=len-2;i++)
 64                 ori[i]=0;
 65             ori[len-1]=2;
 66 
 67             for (i=1;i<=len;i++)
 68             {
 69                 shu[i]-=ori[i];
 70                 if (shu[i]<0)
 71                 {
 72                     shu[i]+=10;
 73                     shu[i+1]--;
 74                 }
 75             }
 76 
 77             printf("%c",shu[len-1]+1+48);
 78             for (i=len-2;i>=1;i--)
 79                 printf("%c",shu[i]+48);
 80             if (len-1>1)
 81             {
 82                 for (i=2;i<=len-2;i++)
 83                     printf("%c",shu[i]+48);
 84                 printf("%c",shu[len-1]+1+48);
 85             }
 86             printf("\n");
 87         }
 88         else
 89         {
 90             ///even
 91             for (i=1;i<=len-2;i++)
 92                 ori[i]=0;
 93             ori[len-1]=1;
 94             ori[len]=1;
 95 
 96             for (i=1;i<=len;i++)
 97             {
 98                 shu[i]-=ori[i];
 99                 if (shu[i]<0)
100                 {
101                     shu[i]+=10;
102                     shu[i+1]--;
103                 }
104             }
105 
106             printf("%c",shu[len-1]+1+48);
107             for (i=len-2;i>=1;i--)
108                 printf("%c",shu[i]+48);
109             for (i=1;i<=len-2;i++)
110                 printf("%c",shu[i]+48);
111             printf("%c",shu[len-1]+1+48);
112             printf("\n");
113         }
114     }
115     return 0;
116 }

猜你喜欢

转载自www.cnblogs.com/cmyg/p/9965712.html