训练赛后补题 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 }


日常让人发疯的诊断……
//-------------------------修正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 }
//---------------------------------------------------
思路总结:没必要做图或者做树,直接设置一个容器装载患病者,遍历容器查看病人接触对象,并把接触对象拉入容器并做标记。容器遍历完毕后查看目标任务在不在容器内即可。

浙公网安备 33010602011771号