LuoguP7041 [NWRRC2016]King's Heir 題解
阿新 • • 發佈:2021-12-16
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; }