LuoguP7041 [NWRRC2016]King's Heir 题解

Content

给出现在的日期,请从 \(n\) 个人当中选出一个人,使得他是所有成年人(\(\geqslant 18\) 岁的人)中年龄最小的。

数据范围:设日期为 \(yy/mm/dd\),则有 \(1\leqslant n\leqslant 100,1\leqslant yy\leqslant 9999,1\leqslant mm\leqslant 12,1\leqslant yy\leqslant 31\)。

Solution

我们可以先把所有年龄小于 18 岁的人在输入的时候就把他给剔除掉,然后在按照出生日期从晚到早排序,最后直接输出第一个人的编号就好了。

注意特判一下没有符合条件的人时的情况。

Code

int y, m, d, n, cnt;
struct son {
	int ye, mo, da, id;
	bool operator < (const son& cz) {
		if(ye != cz.ye) return ye > cz.ye;
		if(mo != cz.mo) return mo > cz.mo;
		return da > cz.da;
	}
}a[107];

int main() {
	d = Rint, m = Rint, y = Rint, n = Rint;
	F(i, 1, n) {
		a[++cnt].da = Rint, a[cnt].mo = Rint, a[cnt].ye = Rint, a[cnt].id = i;
		if(a[cnt].ye + 18 > y) a[cnt--] = (son){0, 0, 0, 0};
		else if(a[cnt].ye + 18 == y) {
			if(a[cnt].mo > m) a[cnt--] = (son){0, 0, 0, 0};
			else if(a[cnt].mo == m) {
				if(a[cnt].da > d) a[cnt--] = (son){0, 0, 0, 0};
			}
		}
	}
	if(!cnt) return printf("-1"), 0;
	sort(a + 1, a + cnt + 1);
	printf("%d", a[1].id);
	return 0;
}
上一篇:安装卸载Windows服务


下一篇:zookeeper:安装和测试