1028 人口普查
某城鎮(zhèn)進(jìn)行人口普查,得到了全體居民的生日?,F(xiàn)請(qǐng)你寫個(gè)程序,找出鎮(zhèn)上最年長和最年輕的人。
這里確保每個(gè)輸入的日期都是合法的,但不一定是合理的——假設(shè)已知鎮(zhèn)上沒有超過 200 歲的老人,而今天是 2014 年 9 月 6 日,所以超過 200 歲的生日和未出生的生日都是不合理的,應(yīng)該被過濾掉。
輸入格式:
輸入在第一行給出正整數(shù)?N,取值在(0,10?5??];隨后?N?行,每行給出 1 個(gè)人的姓名(由不超過 5 個(gè)英文字母組成的字符串)、以及按?yyyy/mm/dd(即年/月/日)格式給出的生日。題目保證最年長和最年輕的人沒有并列。
輸出格式:
在一行中順序輸出有效生日的個(gè)數(shù)、最年長人和最年輕人的姓名,其間以空格分隔。
輸入樣例:
5 John 2001/05/12 Tom 1814/09/06 Ann 2121/01/30 James 1814/09/05 Steve 1967/11/20輸出樣例:
3 Tom John ? 思路:我這里相當(dāng)于是枚舉的寫法,略微有點(diǎn)復(fù)雜,用string存出生日期寫可能會(huì)更簡單一點(diǎn),有個(gè)坑點(diǎn)就是有效生日個(gè)數(shù)為0的情況...... 1 #include<stdio.h> 2 #include<math.h> 3 #include<string.h> 4 #include<stdlib.h> 5 typedef struct birth 6 { 7 char name[6]; 8 int year; 9 int month; 10 int day; 11 } St; 12 int main() 13 { 14 int n; 15 scanf("%d",&n); 16 St num[n]; 17 int t=n;//有效生日數(shù) 18 int maxyear=-1,maxmonth=-1,maxday=-1,minyear=9999,minmonth=9999,minday=9999; 19 for(int i=0;i<n;i++) 20 { 21 scanf("%s %d/%d/%d",num[i].name,&num[i].year,&num[i].month,&num[i].day); 22 if(((num[i].year<1814)||((num[i].year==1814)&&(num[i].month<9))||((num[i].year==1814)&&(num[i].month==9)&&(num[i].day<6)))||((num[i].year>2014)||((num[i].year==2014)&&(num[i].month>9))||((num[i].year==2014)&&(num[i].month==9)&&(num[i].day>6)))) 23 { 24 t--; 25 continue; 26 } 27 if(num[i].year>maxyear) 28 { 29 maxyear=num[i].year; 30 maxmonth=num[i].month; 31 maxday=num[i].day; 32 } 33 else if(num[i].year==maxyear&&num[i].month>maxmonth) 34 { 35 maxmonth=num[i].month; 36 maxday=num[i].day; 37 } 38 else if(num[i].year==maxyear&&num[i].month==maxmonth&&num[i].day>maxday) 39 { 40 maxday=num[i].day; 41 } 42 if(num[i].year<minyear) 43 { 44 minyear=num[i].year; 45 minmonth=num[i].month; 46 minday=num[i].day; 47 } 48 else if(num[i].year==minyear&&num[i].month<minmonth) 49 { 50 minmonth=num[i].month; 51 minday=num[i].day; 52 } 53 else if(num[i].year==minyear&&num[i].month==minmonth&&num[i].day<minday) 54 { 55 minday=num[i].day; 56 } 57 } 58 if(t==0) 59 printf("%d",t); 60 else 61 printf("%d ",t); 62 for(int i=0;i<n;i++) 63 { 64 if(num[i].year==minyear&&num[i].month==minmonth&&num[i].day==minday) 65 printf("%s ",num[i].name); 66 } 67 for(int i=0;i<n;i++) 68 { 69 if(num[i].year==maxyear&&num[i].month==maxmonth&&num[i].day==maxday) 70 printf("%s",num[i].name); 71 } 72 return 0; 73 }?
?補(bǔ)充用string寫的解法,相比于上面的解法更簡單,(果然還是string好用)......
?
?
1 #include<iostream> 2 #include<cstring> 3 #include<cmath> 4 #include<cstdio> 5 #include<algorithm> 6 #include<map> 7 #include<set> 8 #include<vector> 9 using namespace std; 10 #define ll long long 11 #define inf 99999999 12 int main() 13 { 14 string str1="2014/09/06",str2="1814/09/06"; 15 string min="2014/09/06",max="1814/09/06"; 16 string min_name,max_name; 17 int N; 18 scanf("%d",&N); 19 string name,date; 20 int sum=0; 21 for(int i=1;i<=N;i++) 22 { 23 cin>>name>>date; 24 if(date>=str2&&date<=str1) 25 { 26 sum++; 27 if(date<min) 28 { 29 min=date; 30 min_name=name; 31 } 32 if(date>max) 33 { 34 max=date; 35 max_name=name; 36 } 37 } 38 } 39 if(sum==0)//sum為0直接特判 40 printf("%d\n",sum); 41 else 42 cout<<sum<<" "<<min_name<<" "<<max_name<<endl; 43 return 0; 44 }?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/xwl3109377858/p/10473219.html
總結(jié)
- 上一篇: 下载华为交换机MIB参考文件并使用snm
- 下一篇: 并不对劲的长链剖分