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;
}
标签:King,NWRRC2016,题解,mo,ye,cnt,cz,Rint,leqslant 来源: https://www.cnblogs.com/Eason-AC/p/15698074.html