1. 程式人生 > 其它 >LuoguP7041 [NWRRC2016]King's Heir 題解

LuoguP7041 [NWRRC2016]King's Heir 題解

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;
}