1. 程式人生 > >PAT——乙級1028

PAT——乙級1028

這道題花了我半個多小時,對呀乙級算是挺多時間的了。

 

 

1028 人口普查 (20 point(s))

某城鎮進行人口普查,得到了全體居民的生日。現請你寫個程式,找出鎮上最年長和最年輕的人。

這裡確保每個輸入的日期都是合法的,但不一定是合理的——假設已知鎮上沒有超過 200 歲的老人,而今天是 2014 年 9 月 6 日,所以超過 200 歲的生日和未出生的生日都是不合理的,應該被過濾掉。

輸入格式:

輸入在第一行給出正整數 N,取值在(0,105​​];隨後 N 行,每行給出 1 個人的姓名(由不超過 5 個英文字母組成的字串)、以及按 yyyy/mm/dd

(即年/月/日)格式給出的生日。題目保證最年長和最年輕的人沒有並列。

輸出格式:

在一行中順序輸出有效生日的個數、最年長人和最年輕人的姓名,其間以空格分隔。

輸入樣例:

5
John 2001/05/12
Tom 1814/09/06
Ann 2121/01/30
James 1814/09/05
Steve 1967/11/20

輸出樣例:

3 Tom John

 我寫的程式碼是

 1 #include<cstdio>
 2 
 3 struct People
 4 {
 5     char name[6];
 6
int year; 7 int month; 8 int day; 9 }old,young,temp; 10 11 int compare(People a, People b) { 12 if ((a.year > 2014) || (a.year == 2014 && a.month > 9) || (a.year == 2014 && a.month == 9 && a.day > 6)) //判斷是否超過當前日期 13 return 0; 14 if((a.year < 1814
) || (a.year == 1814 && a.month < 9) || (a.year == 1814 && a.month == 9 && a.day < 6))//判斷是否大於200歲 15 return 0; 16 if (a.year < b.year || (a.year == b.year&&a.month < b.month) || (a.year == b.year && a.month == b.month && a.day < b.day))//滿足上面兩個條件才比較兩個日期的大小 17 return -1; 18 if (a.year > b.year || (a.year == b.year&&a.month > b.month) || (a.year == b.year && a.month == b.month && a.day > b.day))//-1是小於,1是大於 19 return 1; 20 return 2; 21 22 } 23 int main() { 24 int n,count=0,flag1,flag2; 25 young = { "",0,0,0 }; 26 old = { "",2014,9,6}; 27 scanf("%d", &n); 28 while (n--) 29 { 30 scanf("%s %d/%d/%d", &temp.name, &temp.year, &temp.month, &temp.day); 31 flag1 = compare(temp, old);//flag1和flag2都是為了儲存判斷狀態 32 if ( flag1== -1) 33 { 34 old = temp; 35 } 36 flag2 = compare(temp, young); 37 if ( flag2== 1) 38 { 39 young = temp; 40 } 41 if (flag1 || flag2)//如果兩次判斷都不為零,也就是滿足條件,那就count+1。 42 { 43 count++; 44 } 45 } 46 if (count == 0) printf("0"); 47 else printf("%d %s %s", count, old.name, young.name); 48 return 0; 49 }

 

注意點:

如果所有人的生日都不滿足條件,記得必須單獨輸出一個0;否則會因為多輸出空格導致格式錯誤的。

再一次體會到PATOJ比牛客OJ更嚴格。

 

old = temp;
這一行是讓直接把結構體的值賦給另一個結構體。

但是用g++編譯器會報錯,提示結構體並沒有過載=

但是用clang++編譯器就不會報錯。我查了一下clang++與g++的區別

gcc/g++ 和 clang/clang++ 都是 Linux 下常用的 C/C++ 編譯器。gcc 是 GNU 親兒子。clang 是後起之秀,配合 llvm,以優秀的前端聞名於世,現在已經是 Mac(XCode) 的預設編譯器,微軟等大公司也都在使用

前景最好的應該是clang,錯誤提示/編譯速度都是一流。另外現在有很多程式碼自動完成/提示工具是基於clang的。clang編譯出的debug檔案已經可以用gdb除錯了哈,vs2015也內建了clang來提供對cross platfrom的支援。

gcc/g++/msvc因為面向了具體的platform,所以老的專案裡面可能用了他們自帶的擴充套件/或者在彼此應用環境下有一些best practice,這個沒有辦法,還得接著用。

 我在我的VS2017上編譯很正常。

其他底層的我也不清楚了,反正以後用clang++就好。