训练赛后补题 09

2020-07-01 个人训练赛后补题

 题号F,原题CodeChef-ECJN206

 节省篇幅,题目梗概:已知一个患病的,一个未知的,一堆接触过的二人组,判断这个未知状态的人要不要隔离。

 

 runtime error【自己编译器能过,网站上不行】的代码:

 1 #pragma warning (disable:4996)
 2 #include <iostream>
 3 #include<algorithm>
 4 #include<stdio.h>
 5 #include<math.h>
 6 #include<string.h>
 7 //#include<string>
 8 #define MAX1 100005            /*1e5 + 5*/
 9 #define MAX2 1000000005        /*le9 + 5*/
10 #define MAX3 200005            /*1e5 + 5*/
11 #define MAX4 5005            /*5e3 + 5*/
12 #define MAX5 10005            /*1e4 + 5*/
13 #define T1 27
14 #define T2 27
15 #define T3 18
16 using namespace std;
17 typedef long long int ll;
18 #define MOL 998244353
19 struct str {
20     char a[12];
21 };
22 struct rel {
23     str a;
24     str b;
25 };
26 int main() {
27     rel all[1005];
28     str sick[2005];
29     str a, b, x, y;
30     int t, n;
31     while (scanf("%d", &t) != EOF) {
32         int i, j, k;
33         for (k = 0; k < t; ++k) {
34             cin >> n >> x.a >> y.a;
35             for (i = 0; i < n; i++) {
36                 cin >> a.a >> b.a;
37                 //cout << a << " " << b << endl;
38                 strcpy(all[i].a.a, a.a);
39                 strcpy(all[i].b.a, b.a);
40             }
41             sick[0] = x;
42             int sicksize = 1;
43             for (i = 0; i < sicksize; ++i) {
44                 for (j = 0; j < n; ++j) {
45                     if (strcmp(all[j].a.a, sick[i].a) == 0) {
46                         sick[sicksize++] = all[j].b;
47                     }
48                     if (strcmp(all[j].b.a, sick[i].a) == 0) {
49                         sick[sicksize++] = all[j].a;
50                     }
51                 }
52             }
53             for (i = 0; i <= sicksize; ++i)
54                 if (strcmp(sick[i].a, y.a) == 0)break;
55             if (i > sicksize)printf("Stay Home, Stay Safe\n");
56             else printf("Quarantine\n");
57         }
58     }
59     delete sick;
60     return 0;
61 }
Runtime Error

 

 

 

日常让人发疯的诊断……

//-------------------------修正ing--------------------------------

分析原因:当恰恰好所有人接触患病时,栈会爆掉。

解决方法:结构体加一个int做标记

 

AC代码:

 1 #pragma warning (disable:4996)
 2 #include <iostream>
 3 #include<algorithm>
 4 #include<stdio.h>
 5 #include<math.h>
 6 #include<string.h>
 7 //#include<string>
 8 #define MAX1 100005            /*1e5 + 5*/
 9 #define MAX2 1000000005        /*le9 + 5*/
10 #define MAX3 200005            /*1e5 + 5*/
11 #define MAX4 5005            /*5e3 + 5*/
12 #define MAX5 10005            /*1e4 + 5*/
13 #define T1 27
14 #define T2 27
15 #define T3 18
16 using namespace std;
17 typedef long long int ll;
18 #define MOL 998244353
19 struct str {
20     char a[15];
21     int issick;
22 };
23 struct rel {
24     str a;
25     str b;
26 };
27 int main() {
28     rel all[1005];
29     str sick[2005];
30     str a, b, x, y;
31     int t, n;
32     while (scanf("%d", &t) != EOF) {
33         int i, j, k;
34         for (k = 0; k < t; ++k) {
35             cin >> n >> x.a >> y.a;
36             x.issick = 1;
37             for (i = 0; i < n; i++) {
38                 cin >> a.a >> b.a;
39                 a.issick = b.issick = 0;
40                 //cout << a << " " << b << endl;
41                 all[i].a = a;
42                 all[i].b = b;
43                 //cout << all[i].a.a << " " << all[i].b.a << endl;
44             }
45             sick[0] = x;
46             int sicksize = 1;
47             for (i = 0; i < sicksize; ++i) {
48                 for (j = 0; j < n; ++j) {
49                     //cout << all[j].a.a << all[j].a.issick << " " << all[j].b.a << all[j].b.issick << " " << sick[sicksize - 1].a << endl;
50                     if ((strcmp(all[j].a.a, sick[i].a) == 0) && (all[j].a.issick != 1)) {
51                         all[j].a.issick = 1;
52                         all[j].b.issick = 1;
53                         sick[sicksize++] = all[j].b;
54                         //cout << i << " " << j << endl;
55                     }
56                     if ((strcmp(all[j].b.a, sick[i].a) == 0) && (all[j].b.issick != 1)) {
57                         all[j].b.issick = 1;
58                         all[j].a.issick = 1;
59                         sick[sicksize++] = all[j].a;
60                         //cout << i << " " << j << endl;
61                     }
62                 }
63             }
64             for (i = 0; i < sicksize; ++i) {
65                 //cout << sick[i].a << " " << sick[i].issick << endl;
66                 if (strcmp(sick[i].a, y.a) == 0)
67                     break;
68             }
69             if (i >= sicksize)printf("Stay Home, Stay Safe\n");
70             else printf("Quarantine\n");
71         }
72     }
73     return 0;
74 }

//---------------------------------------------------

思路总结:没必要做图或者做树,直接设置一个容器装载患病者,遍历容器查看病人接触对象,并把接触对象拉入容器并做标记。容器遍历完毕后查看目标任务在不在容器内即可。

posted @ 2020-07-22 15:39  听说福建人很好吃  阅读(102)  评论(0)    收藏  举报