当前位置: 首页 > news >正文

省赛选拔赛解题报告

A题

  给一个数字,看是否能够分成两个偶数a  b,且a  b 都要大于0。

  很显然对于一个数字 k , 如果k能够被2整除,整除后有两种情况,要么都是偶数,要么都是奇数,对于都是偶数情况已经满足,对于两个奇数情况,总能够将一个奇数减1,一个奇数加1得到两个偶数。这里考虑特例 2 单独排除即可。

 

 1 #include <stdio.h>
 2 #include <cstdio>
 3 #include <iostream>
 4 #include <string.h>
 5 #include <algorithm>
 6 #define INF 0x3f3f3f3f
 7 #define MAXX 100010
 8 #define LL long long
 9 using namespace std;
10  
11 int main()
12 {
13    LL T, a;
14     while(~scanf("%lld", &T))
15     {
16         while(T--)
17         {
18             scanf("%lld", &a);
19              if(a%2==0 && a!=2)
20                 printf("Yes\n");
21              else
22                 printf("No\n");
23         }
24     }
25 }

B题

Time Limit: 1 Sec  Memory Limit: 128 MB

Description

在很多 RPG (Role-playing Games) 游戏中,迷宫往往是非常复杂的游戏环节。通常来说,我们在走迷宫的时候都需要花非常多的时间来尝试不同的路径。但如果有了算法和计算机的帮助,我们能不能有更快的方式来解决这个问题?我们可以进行一些尝试。
现在我们有一个 N 行 M 列的迷宫。迷宫的每个格子如果是空地则可以站人,如果是障碍则不行。在一个格子上,我们可以一步移动到它相邻的 8 个空地上,但不能离开地图的边界或者跨过两个障碍的夹缝。下图是一个移动规则的示例。
 
为了离开迷宫,我们还需要触发迷宫中所有的机关。迷宫里总共有 K 个机关,每个机关都落在一个不同的空地上。如果我们到达了某个机关所在的格子时,这个机关就会被自动触发,并在触发之后立即消失。我们的目标是按顺序触发所有的 K个机关,而当最后一个机关被触发时,我们就可以离开迷宫了。
 

 

Input

输入的第一行是测试数据的组数 T (T ≤ 20)。
对于每组测试数据:第一行包含地图的行数 N (2 ≤ N  ≤ 100),列数 M(2 ≤ M  ≤ 100) 和机关的数量 K(1 ≤ K ≤10)。接下来 N 行,每行包含 M 个字符,其中字符 ‘#’ 表示障碍,而 ‘.’ 表示空地。接下来一行描述了我们的初始位置 (x, y),表示我们一开始在第 x 行第 y 列的格子上。这个格子保证是个空地。接下来 K 行,每行给出了一个机关的位置。所有的机关都不会出现在障碍上,并且任意两个机关不会出现在同一个空地上。我们需要按输入给定的顺序触发所有的 K 个机关。

 

Output

对于每组测试数据,输出离开迷宫所需要的最少步数。如果无论如何都不能离开迷宫,输出 -1。

 

Sample Input

3
3 3 2
...
...
...
1 1
1 3
2 2
3 3 1
...
.#.
...
1 1
3 3
2 3 1
..#
.#.
1 1
2 3

Sample Output

3
3
-1

 只要注意 : 1.起始点不能出现在除了第一个机关外的其它机关位置,不然直接无法走出迷宫。

      2.只说不能从两个障碍的夹缝中间走过,并没有说不能从一个障碍和一个机关,或两个机关的夹缝中走过。

考虑过这些就可以写BFS了。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <string>
  4 #include <vector>
  5 #include <map>
  6 #include <string.h>
  7 #include <queue>
  8 using namespace std;
  9  
 10 #define PP pair<int,int>
 11 #define x first
 12 #define y second
 13 #define mk(a,b) make_pair(a,b)
 14  
 15  
 16 int dx1[] = {-1 , 0 , 0 , 1};
 17 int dy1[] = {0 , -1 , 1 , 0};
 18 int dx2[] = {-1 , -1 , 1 , 1};
 19 int dy2[] = {-1 , 1 , -1 , 1};
 20  
 21 int N , M , K;
 22  
 23 PP aim_set[11];
 24  
 25 int _map[110][110];
 26 int val[110][110];
 27  
 28 void init()
 29 {
 30     memset(_map,0,sizeof(_map));
 31     return ;
 32 }
 33 void init2()
 34 {
 35     memset(val,-1,sizeof(val));
 36     return ;
 37 }
 38 int bfs(int beginx , int beginy , int endx , int endy)
 39 {
 40     queue<PP> QQ;
 41     while(!QQ.empty()) QQ.pop();
 42     QQ.push(mk(beginx,beginy));
 43     val[beginx][beginy] = 0;
 44  
 45   
 46  
 47     while(!QQ.empty())
 48     {
 49         PP temp = QQ.front();
 50         QQ.pop();
 51         int nx = temp.x , ny = temp.y;
 52         if(nx == endx && ny == endy) break;//
 53         bool sign[4]; for(int i = 0 ; i < 4 ; i++) sign[i] = 0;
 54  
 55         for(int i = 0 ; i < 4 ; i++)
 56         {
 57             int kx = nx + dx1[i] , ky = ny + dy1[i];
 58             if(_map[kx][ky] != 0) sign[i] = 1;
 59         }
 60         //
 61         bool block[4]; for(int i = 0 ; i < 4 ; i++) block[i] = 0;
 62         block[0] = (sign[0] || sign[1]);
 63         block[1] = (sign[0] || sign[2]);
 64         block[2] = (sign[1] || sign[3]);
 65         block[3] = (sign[2] || sign[3]);
 66         //
 67         for(int i = 0 ; i < 4 ; i++)
 68         {
 69             int kx = nx + dx2[i] , ky = ny + dy2[i];
 70             if(_map[kx][ky] == 1 && val[kx][ky] == -1 && block[i])
 71             {
 72                 val[kx][ky] = val[nx][ny] + 1;
 73                 QQ.push(mk(kx,ky));
 74             }
 75         }
 76         for(int i = 0 ; i < 4 ; i++)
 77         {
 78             int kx = nx + dx1[i] , ky = ny + dy1[i];
 79             if(_map[kx][ky] == 1 && val[kx][ky] == -1)
 80             {
 81                 val[kx][ky] = val[nx][ny] + 1;
 82                 QQ.push(mk(kx,ky));
 83             }
 84         }
 85  
 86     }
 87     return val[endx][endy];
 88 }
 89 int main()
 90 {
 91     int T;
 92     while(~scanf("%d",&T))
 93     {
 94         while(T--)
 95         {
 96             init();
 97             scanf("%d %d %d",&N,&M,&K);
 98             getchar();
 99  
100             for(int i = 1 ; i <= N ; i++)
101             {
102                 for(int j = 1; j <= M ; j++)
103                 {
104                     char temp;
105                     scanf("%c",&temp);
106                     temp == '.' ? _map[i][j] = 1 : _map[i][j] = 0;
107                 }
108                 getchar();
109             }
110             for(int i = 0 ; i <= K ; i++)
111             {
112                 scanf("%d %d",&aim_set[i].x,&aim_set[i].y);
113                 _map[aim_set[i].x][aim_set[i].y] = -1;
114             }
115             int ans = 0;
116             ////
117             int bx = aim_set[0].x , by = aim_set[0].y;
118             for(int i = 2 ; i <= K ; i++)
119             {
120                 if(bx == aim_set[i].x && by == aim_set[i].y){ans = -1 ; break;}
121             }
122             if(ans < 0) {cout << ans << endl; continue;}
123             /
124             for(int i = 1 ; i <= K ; i++)
125             {
126                 int tx = aim_set[i - 1].x , ty = aim_set[i - 1].y;
127                 int px = aim_set[i].x , py = aim_set[i].y;
128  
129                 _map[tx][ty] = 1;
130                 _map[px][py] = 1;
131  
132                 init2();
133                 int temp = bfs(tx , ty , px , py);
134               
135                 if(temp < 0){ans = -1 ; break;}
136                 else ans += temp;
137             }
138             printf("%d\n", ans);
139         }
140     }
141     return 0;
142 }

C题

Time Limit: 1 Sec  Memory Limit: 128 MB

Description

 

Input

 

Output

 

Sample Input

1
2

Sample Output

Alice

找规律得到似乎判断谁赢只要是否能被 7 整除 = = (好扯淡)
 1 #include <stdio.h>
 2 #include <iostream>
 3 #include <algorithm>
 4 using namespace std;
 5  
 6 int main()
 7 {
 8     int n  ,t;
 9     cin >> t;
10     while(t--)
11     {
12         cin >> n;
13         if(n % 7 == 0)
14             cout << "Bob" << endl;
15         else
16             cout << "Alice" << endl;
17     }   
18     return 0;
19 }

D,F 题留坑

D题:据说是个排列组合题,然而我对期望值概率方面不懂深入。

F题:状态压缩dp,留坑,不了解。

E题

直接按题意模拟,这里盗用A神代码

 

  1 #include <iostream>
  2 #include <fstream>
  3 #include <cstring>
  4 #include <climits>
  5 #include <deque>
  6 #include <cmath>
  7 #include <queue>
  8 #include <stack>
  9 #include <list>
 10 #include <map>
 11 #include <set>
 12 #include <utility>
 13 #include <sstream>
 14 #include <complex>
 15 #include <string>
 16 #include <vector>
 17 #include <cstdlib>
 18 #include <cstdio>
 19 #include <ctime>
 20 #include <bitset>
 21 #include <functional>
 22 #include <algorithm>
 23  
 24 using namespace std;
 25  
 26 int trH(char str[]) {
 27     int val = 0;
 28     int len = strlen(str);
 29     for (int i = 0; i < len - 1; ++i) {
 30         val = val * 16;
 31         if (str[i] >= '0' && str[i] <= '9') {
 32             val += str[i] - '0';
 33         }
 34         else {
 35             if (str[i] >= 'a' && str[i] <= 'z') {
 36                 val += str[i] - 'a' + 10;
 37             }
 38             else {
 39                 val += str[i] - 'A' + 10;
 40             }
 41         }
 42     }
 43     return val;
 44 }
 45  
 46 int trB(char str[]) {
 47     int val = 0;
 48     int len = strlen(str);
 49     for (int i = 0; i < len - 1; ++i) {
 50         val = val * 2 + str[i] - '0';
 51     }
 52     return val;
 53 }
 54  
 55 int trD(char str[]) {
 56     int val = 0;
 57     int len = strlen(str);
 58     for (int i = 0; i < len; ++i) {
 59         val = val * 10 + str[i] - '0';
 60     }
 61     return val;
 62 }
 63  
 64 pair <int, int> reg[4];
 65  
 66 int main() {
 67     int t;
 68     scanf("%d", &t);
 69     while (t--) {
 70         int n;
 71         scanf("%d", &n);
 72         for (int i = 0; i < 4; ++i) {
 73             reg[i].first = reg[i].second = 0;
 74         }
 75         char op[10], s1[10], s2[10], s[35];
 76         for (int i = 1; i <= n; ++i) {
 77             scanf("%s", op);
 78             if (!strcmp(op, "MUL")) {
 79                 scanf("%s", s1);
 80                 int reg_id = s1[0] - 'A';
 81                 char reg_ty = s1[1];
 82                 long long v1, v2;
 83                 if (reg_ty == 'H') {
 84                     // 8 bit higher reg
 85                     v1 = reg[0].first;
 86                     v2 = reg[reg_id].second;
 87                 }
 88                 else if (reg_ty == 'L') {
 89                     // 8bit lower reg
 90                     v1 = reg[0].first;
 91                     v2 = reg[reg_id].first;
 92                 }
 93                 else {
 94                     // 16 bit reg
 95                     v1 = reg[0].second * 256 + reg[0].first;
 96                     v2 = reg[reg_id].second * 256 + reg[reg_id].first;
 97                 }
 98                 long long res = v1 * v2;
 99                 if (reg_ty == 'X') {
100                     reg[0].second = res % 65536 / 256;
101                     reg[0].first = res % 65536 % 256;
102                     reg[3].second = res / 65536 / 256;
103                     reg[3].first = res / 65536 % 256;
104                 }
105                 else {
106                     reg[0].second = res / 256;
107                     reg[0].first = res % 256;
108                 }
109             }
110             else {
111                 scanf("%s", s);
112                 int id;
113                 int reg1_id, reg1_ty;
114                 int len = strlen(s);
115                 reg1_id = s[0] - 'A';
116                 reg1_ty = s[1];
117                 int val;
118                 if (s[3] >= 'A' && s[3] <= 'Z') {
119                     int reg2_id = s[3] - 'A';
120                     char reg2_ty = s[4];
121                     if (reg2_ty == 'H') {
122                         val = reg[reg2_id].second;
123                     }
124                     else if (reg2_ty == 'L') {
125                         val = reg[reg2_id].first;
126                     }
127                     else {
128                         val = reg[reg2_id].second * 256 + reg[reg2_id].first;
129                     }
130                 }
131                 else {
132                     char tmp[30];
133                     int x = 0;
134                     for (int i = 3; i < len; ++i) {
135                         tmp[x++] = s[i];
136                     }
137                     tmp[x] = '\0';
138                     if (tmp[x - 1] == 'B') {
139                         val = trB(tmp);
140                     }
141                     else if (tmp[x - 1] == 'H') {
142                         val = trH(tmp);
143                     }
144                     else {
145                         val = trD(tmp);
146                     }
147                 }
148                 if (!strcmp(op, "MOV")) {
149                     if (reg1_ty == 'H') {
150                         reg[reg1_id].second = val;
151                     }
152                     else if (reg1_ty == 'L') {
153                         reg[reg1_id].first = val;
154                     }
155                     else {
156                         reg[reg1_id].first = val % 256;
157                         reg[reg1_id].second = val / 256;
158                     }
159                 }
160                 else {
161                     if (reg1_ty == 'H') {
162                         reg[reg1_id].second += val;
163                     }
164                     else if (reg1_ty == 'L') {
165                         reg[reg1_id].first += val;
166                     }
167                     else {
168                         val += reg[reg1_id].second * 256 + reg[reg1_id].first;
169                         reg[reg1_id].first = val % 256;
170                         reg[reg1_id].second = val / 256;
171                     }
172                 }
173             }
174         }
175         for (int i = 0; i < 4; ++i) {
176             int val = reg[i].second * 256 + reg[i].first;
177             printf("%d%s", val, i == 3 ? "\n" : " ");
178         }
179     }
180     return 0;
181 }

 

 

 

G题

Time Limit: 3 Sec  Memory Limit: 128 MB

Description

 

Input

 

Output

 

Sample Input

1
3 4 4
Q 1 1 1 1
Q 1 1 3 2
M 1 1 3
Q 1 1 3 4

Sample Output

2
21
55

按要求操作矩阵,可以先进行预处理,设置数组sum[i][j] 表示 初始情况下对角线(1,1) 到 (i,j) 所表示的矩形内的和。当修改(x,y)的值时,我们修改sum[x][y] 到 sum[n][m]的值(两层for)即可。任意所给询问Q bx by ex ey 答案为 sum[ex][ey] - sum[bx-1][ey] - sum[ex][by-1] + sum[bx-1][by-1];

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <string.h>
 4  
 5 using namespace std;
 6  
 7 int sum[1010][1010];
 8 int a[1010][1010];
 9  
10 void init(int n , int m)
11 {
12     memset(sum,0,(n+10)*(m+10)*sizeof(int));
13     memset(a,0,(n+10)*(m+10)*sizeof(int));
14  
15     for(int i = 1 ; i <= n ; i++)
16     {
17         for(int j = 1 ; j <= m ;j++)
18         {
19             sum[i][j] = sum[i][j-1] + sum[i-1][j] - sum[i-1][j-1] + (i+j);
20             a[i][j] = i + j;
21         }
22     }
23     return ;
24 }
25  
26  
27 int Q(int bx , int by , int ex , int ey)
28 {
29     return (sum[ex][ey] - sum[bx-1][ey] - sum[ex][by-1] + sum[bx-1][by-1]);
30 }
31  
32 void M(int x , int y , int val , int n , int m)
33 {
34     for(int i = x ; i <= n ; i++) for(int j = y ; j <= m ; j++)
35     {
36         sum[i][j] += val - a[x][y];
37     }
38     a[x][y] = val;
39     return ;
40 }
41  
42 int main()
43 {
44     int T;
45     while(~scanf("%d",&T))
46     {
47         while(T--)
48         {
49             int n , m , q;
50             scanf("%d %d %d",&n,&m,&q);
51             init(n,m);
52  
53             for(int i = 0 ; i < q ; i++)
54             {
55                 char op[10];
56                 scanf("%s",op);
57                 if(op[0] == 'Q')
58                 {
59                     int a , b , c , d ;
60                     scanf("%d %d %d %d",&a,&b,&c,&d);
61                     printf("%d\n", Q(a,b,c,d));
62                 }
63                 else
64                 {
65                     int a , b , c;
66                     scanf("%d %d %d",&a,&b,&c);
67                     M(a,b,c,n,m);
68                 }
69             }
70         }
71     }
72  
73     return 0;
74  
75 }

H题留坑

I题

Time Limit: 1 Sec  Memory Limit: 128 MB

 

Description

 

 

 

Input

 

 

 

Output

 

 

 

Sample Input

 

2
2 3
111
000
90
3 3
111
101
111
180

 

Sample Output

 

01
01
01
111
101
111

 

 仅仅需要考虑 0 90 180 270 ,找到规律后旋转输出即可,(长变宽 , 宽变长)。

 1 #include <stdio.h>
 2 #include <iostream>
 3 #include <algorithm>
 4 using namespace std;
 5  
 6 char s[60][60];
 7  
 8 int main()
 9 {
10     int n;
11     cin >> n;
12         while(n--)
13         {
14             int a , b;
15             cin >> a >> b;
16             for(int i = 0 ; i < a ; i++)
17             {
18                 for(int j = 0 ; j < b ; j++)
19                 {
20                     cin >> s[i][j];
21                 }
22                 getchar();
23             }               
24             int m;
25             cin >> m;
26             if(m == 0)
27             {
28                 for(int i = 0 ; i < a ; i++)
29                 {
30                     for(int j = 0 ; j < b ; j++)
31                     {
32                         cout << s[i][j];
33                     }
34                     if(i != a - 1)
35                         cout << endl;
36                 }
37             }
38             if(m == 90)
39             {
40                 for(int i = 0 ; i < b ; i++)
41                 {
42                     for(int j = a - 1 ; j >= 0 ; j--)
43                     {
44                         cout << s[j][i]   ;
45                     }
46                     if(i != b - 1)
47                         cout << endl;
48                 }
49             }
50             if(m == 180)
51             {
52                 for(int i = a - 1 ; i  >= 0 ; i--)
53                 {
54                     for(int j = b - 1 ; j >= 0 ; j--)
55                     {
56                         cout << s[i][j];
57                     }
58                     if(i != 0)
59                         cout << endl;
60                 }
61             }
62             if(m == 270)
63             {
64                 for(int i = b - 1 ; i >= 0 ; i--)
65                 {
66                     for(int j = 0 ; j < a ; j++)
67                     {
68                         cout << s[j][i];
69                     }
70                     if(i != 0)
71                         cout << endl;
72                 }
73             }
74                 cout << endl;
75         }
76     return 0;
77 }

J题

Time Limit: 1 Sec  Memory Limit: 128 MB

Description

 

Input

 

Output

 

Sample Input

3
1
10
3
10 5 3
1 2
1 3
5
1 2 3 4 5
3 1
2 1
2 4
2 5

Sample Output

Yes
No
Yes

 最保险的做法应该是写dfs,从1开始,然而这题数据给的并不严格,可以用数组做完。

 1 #include <iostream>
 2 #include <cstdio>
 3  
 4 using namespace std;
 5  
 6 int val[110];
 7 int l[110];
 8 int r[110];
 9  
10 void init()
11 {
12     for(int i = 0 ; i < 110 ; i++)
13     {
14         l[i] = i ; r[i] = i;    val[i] = 0; 
15     }
16     return ;
17 }
18  
19 void link(int fa , int son)
20 {
21     if(l[fa] == fa)
22     {l[fa] = son; return ;}
23     if(r[fa] == fa)
24     {r[fa] = son; return ;}
25  
26     return;
27 }
28  
29 int check_max(int point)
30 {
31     int ans = val[point];
32     if(l[point] != point){ans = max(ans , check_max(l[point]));}
33     if(r[point] != point){ans = max(ans , check_max(r[point]));}
34     return ans;
35 }
36  
37 bool cal(int aim)
38 {
39     int max_num = 0;
40     if(l[aim] != aim){max_num = max(max_num , check_max(l[aim]));}
41     if(r[aim] != aim){max_num = max(max_num , check_max(r[aim]));}
42     //cout << " ==  " << aim << "  ==   " << max_num << endl;
43     if(max_num == 0) return 1;
44     if(val[aim] <= max_num) return 1;
45     return 0;
46 }
47  
48 int main()
49 {
50     int T;
51     while(~scanf("%d",&T)) while(T--)
52     {
53         init();
54         int n;
55         scanf("%d",&n);
56         for(int i = 1 ; i <= n ; i++)
57         {
58             scanf("%d",&val[i]);
59         }
60         for(int i = 0 ; i < n - 1 ; i++)
61         {
62             int a , b;
63             scanf("%d%d",&a,&b);
64             a > b ? link(b,a) : link(a,b);
65         }
66  
67         bool flag = 1;
68  
69         for(int i = 1 ; i <= n ; i++)
70         {
71             flag = cal(i);
72             if(!flag) break;
73         }
74  
75         printf("%s\n", flag ? "Yes" : "No");
76     }
77     return 0;
78 }

 

转载于:https://www.cnblogs.com/ticsmtc/p/5246382.html

相关文章:

  • ID、句柄、指针、对象互相转换
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • sql 查出一张表中重复的所有记录数据
  • Spinner使用二
  • 用jquery写循环播放div的相关笔记 珍贵的总结 -1
  • 【Python】raw转义字符
  • 【OpenStack】OpenStack系列4之Glance详解
  • 事件委托的小应用
  • WP_Query的使用方法
  • docker容器互联 分离部署PHP 和 nginx(端口映射方式)
  • mongoose post方法总结and疑点
  • 算法导论笔记——第十二~十四章 数据结构(二)树
  • 招Java工程师一名
  • React Native商城项目实战10 - 个人中心中间内容设置
  • shell中的并且、和、或者
  • 【comparator, comparable】小总结
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Laravel核心解读--Facades
  • 百度地图API标注+时间轴组件
  • 大快搜索数据爬虫技术实例安装教学篇
  • 和 || 运算
  • 机器学习学习笔记一
  • 京东美团研发面经
  • 理清楚Vue的结构
  • 最近的计划
  • gunicorn工作原理
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​渐进式Web应用PWA的未来
  • #QT(TCP网络编程-服务端)
  • (libusb) usb口自动刷新
  • (二)hibernate配置管理
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (九)One-Wire总线-DS18B20
  • (十八)三元表达式和列表解析
  • (一)u-boot-nand.bin的下载
  • (转载)Linux 多线程条件变量同步
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • ***通过什么方式***网吧
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .Net6 Api Swagger配置
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • @font-face 用字体画图标
  • @JSONField或@JsonProperty注解使用
  • [1] 平面(Plane)图形的生成算法
  • [AutoSar NVM] 存储架构
  • [C#]获取指定文件夹下的所有文件名(递归)
  • [HNOI2010]BUS 公交线路
  • [LeetCode][LCR178]训练计划 VI——使用位运算寻找数组中不同的数字
  • [Power Query] 数据的拆分、提取与合并
  • [Spring Cloud] gateway全局异常捕捉统一返回值
  • [UIUCTF 2022] crypto ASR,WringingRing
  • [WebKit] JavaScriptCore解析--基础篇 (一)JSC与WebCore
  • [毕业设计源代码]精品基于SSM的线上点餐系统[包运行成功]