0
点赞
收藏
分享

微信扫一扫

1028 人口普查(附详细注释,逻辑分析)


写在前面

  • 实现思路
  • 结构体封装姓名、出生年月人的元数据信息
  • 巧妙利用scanf读取格式
  • 出生日期有效性判断
  • 算法笔记代码略冗长,熟练的话10分钟内a题

测试用例

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

output:
3

ac代码

#include<cstdio>
struct person
{
char name[10];
int yy, mm, dd;
} oldest, youngest, left, right, tmp;
bool LessEqu(person a, person b)
{
if(a.yy != b.yy) return a.yy <= b.yy;
else if(a.mm != b.mm) return a.mm <= b.mm;
else return a.dd <= b.dd;
}
bool MoreEqu(person a, person b)
{
if(a.yy != b.yy) return a.yy >= b.yy;
else if(a.mm != b.mm) return a.mm >= b.mm;
else return a.dd >= b.dd;
}
void init()
{
youngest.yy = left.yy = 1814;
oldest.yy = right.yy = 2014;
youngest.mm = oldest.mm = left.mm = right.mm = 9;
youngest.dd = oldest.dd = left.dd = right.dd = 6;
}

int main()
{
init();
int n, num=0;
scanf("%d", &n);

for(int i=0; i<n; i++)
{
scanf("%s %d/%d/%d", tmp.name,&tmp.yy,&tmp.mm,&tmp.dd);
if(MoreEqu(tmp, left) && LessEqu(tmp, right))
{
num++;
if(LessEqu(tmp, oldest)) oldest = tmp;
if(MoreEqu(tmp, youngest)) youngest = tmp;
}
}
if(num==0) printf("0\n");
else printf("%d %s %s", num, oldest.name, youngest.name);

return 0;
}

参考代码

  • ​​1028. 人口普查(20).cpp​​

#include <iostream>
using namespace std;
int main() {
int n, cnt = 0;
cin >> n;
string name, birth, maxname, minname, maxbirth = "1814/09/06", minbirth = "2014/09/06";
for (int i = 0; i < n; i++) {
cin >> name >> birth;
if (birth >= "1814/09/06" && birth <= "2014/09/06") {
cnt++;
if (birth >= maxbirth) {
maxbirth = birth;
maxname = name;
}
if (birth <= minbirth) {
minbirth = birth;
minname = name;
}
}
}
cout << cnt;
if (cnt != 0) cout << " " << minname << " " << maxname;
return 0;
}

C++ 字符串比较

  • ​C++ 字符串可以和类型相同的字符串相比较,也可以和具有同样字符类型的数组比较​
  • 串值相同,返回 0;若字符串 S 字典序先于 S2,返回负值;反之,返回正值

// m = 1, n = -1
string A ("aBcdef");
string B ("AbcdEf");
int m=A.compare (B); //完整的A和B的比较
int n=A.compare(1,5,B,4,2); //"Bcdef"和"AbcdEf"比较


举报

相关推荐

0 条评论