1. 程式人生 > >The 2018 ACM-ICPC Asia Beijing Regional Contest

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 }