PAT A1083!
网上的博客贴实在毫无灵魂,这道题第三个测试点如果最后一行输出完后,如果不多输出一个换行,就会被判格式错误。这样一个明显令人无语的判定竟然没人吐槽更让人无语。
前景提要:目前刷的40多道PATA题中有多行输出的大部分会有一句要求,即最后一行后面不得有多余的换行,而没有这句话的除这题外,避免输出这个多余的换行都能顺利通过,于是只在多行输出中间加换行,而最后一行输出结束后不输出换行,是我应该也是其他人的惯常做法。
顺便贴一下我的代码,比网上看到的几个其他人的做法要好。他们的做法大同小异,都是把数据记录在一个无序的结构体数组中,排序,轮询判断输出。时间复杂度是n + nlogn + n,而我的做法是直接将对应name和id记在以grade为下标的结构体数组中,第二步便可轮询指定区间输出,时间复杂度为n + n。
1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <cstdio> 4 #include <string> 5 #include <iostream> 6 using namespace std; 7 8 struct Grade { 9 string name; 10 string id; 11 bool flag; 12 Grade() 13 { 14 flag = false; //true时被使用 15 } 16 }grade[105]; 17 18 int main() 19 { 20 int n; 21 int grade1, grade2; 22 bool exist = false; 23 scanf("%d", &n);
24 for (int i = 0; i < n; i++) 25 { 26 int tempG; 27 string tempN, tempId; 28 cin >> tempN >> tempId; 29 scanf("%d", &tempG); 30 grade[tempG].flag = true; 31 grade[tempG].id = tempId; 32 grade[tempG].name = tempN; 33 }
34 scanf("%d%d", &grade1, &grade2);
35 for (int g = grade2; g >= grade1; g--) 36 { 37 if (grade[g].flag == true) 38 { 39 //if (g < grade2) printf("\n"); 40 exist = true; 41 cout << grade[g].name << " " << grade[g].id << endl; 42 } 43 }
44 if (exist == false) printf("NONE"); 45 46 return 0; 47 }