测试点3错的来:1028 人口普查 (20分)(解题报告)
立志用更少的代碼做更高效的表達
某城鎮進行人口普查,得到了全體居民的生日。現請你寫個程序,找出鎮上最年長和最年輕的人。
這里確保每個輸入的日期都是合法的,但不一定是合理的——假設已知鎮上沒有超過 200 歲的老人,而今天是 2014 年 9 月 6 日,所以超過 200 歲的生日和未出生的生日都是不合理的,應該被過濾掉。
輸入格式:
輸入在第一行給出正整數 N,取值在(0,10^?5 ];隨后 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
問題分析:
兩種解法:
解法一:定義結構體, 存放數據, 定義結構體比較大小的函數, 分別比較出最大值和最小值即可。
解法二:由于所有日期都是合法的, 因此只需比較日期是否在范圍內即可。 于是可以將日期轉化為int型變量比較, 提高效率。
要注意的是:
1、無論哪種解法, 都一定要輸入一個數,就判斷一個數, 即時存儲和操作, 而不能存放在數組里再遍歷, 這樣會超時。
2、如果依然超時, 可以試著將C++代碼換成C語言代碼, 因為C語言比C++快一些。
3、如果沒有符合的,則輸出0, 后面沒有空格。 (測試點三)
二更:
經評論區提醒, 可以采用部分模擬的實現方法, 只用了16行代碼實現AC。 比起結構體這種中規中矩的模擬解法效率高出不少。
一更:結構體解法
#include<iostream> using namespace std;struct Birthday{string name;int year, month, day; }; bool compare(Birthday b1, Birthday b2){ //比較,按年月日排序 if(b1.year != b2.year) return b1.year<b2.year;else {if(b1.month != b2.month) return b1.month<b2.month;else {return b1.day < b2.day;}} } bool fuhe(Birthday b1) { //判斷是否符合if(b1.year < 1814) return false;else if(b1.year == 1814) {if(b1.month < 9) return false;else if(b1.month == 9) {if(b1.day < 6) return false;}}if(b1.year>2014) return false;else if(b1.year == 2014) {if(b1.month > 9) return false;else if(b1.month == 9) {if(b1.day > 6) return false;}}return true; }Birthday fuzhi(Birthday b1, Birthday b2) { //結構體賦值b1.name = b2.name;b1.year = b2.year;b1.month = b2.month;b1.day = b2.day;return b1; }int main() {Birthday Max, Min;int n; cin>>n; int num1 = 0; //記錄符合的個數 bool flag = true;for(int i = 0; i < n; i++) {Birthday B;cin >> B.name; scanf("%d/%d/%d", &B.year, &B.month, &B.day);if(fuhe(B)) {num1++; if(flag) { //第一次循環時,先給Max和Min賦值flag = false;Max = fuzhi(Max, B);Min = fuzhi(Min, B); } else {if(compare(Max, B)) {Max = fuzhi(Max, B);}if(compare(B, Min)) {Min = fuzhi(Min, B);}}}}if(num1 == 0) cout << 0;else cout << num1 << ' ' << Min.name << ' ' << Max.name << endl; return 0; }二更代碼
#include<bits/stdc++.h> using namespace std; int main() {int n, num = 0; cin >> n; string s1, s2, min_y = "9", max_y = "0", min_n, max_n; while(n--) {cin >> s1 >>s2;if(!(s2 >= "1814/09/06" && s2 <= "2014/09/06")) continue;num++; if(min_y > s2) { min_y = s2; min_n = s1; }if(max_y < s2) { max_y = s2; max_n = s1; }}cout << num;if(num) cout << ' ' << min_n << ' ' << max_n << '\n';return 0; }??????——錯過落日余暉,請記得還有漫天星辰
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的测试点3错的来:1028 人口普查 (20分)(解题报告)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编译原理习题(含答案)——4-7语法分析
- 下一篇: 【简洁易懂】Filter的四种拦截方式