日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

测试点3错的来:1028 人口普查 (20分)(解题报告)

發布時間:2024/2/28 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 测试点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分)(解题报告)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。