2017.10.30noip赛前集训 | T1 军训排队模拟
Posted E-Valley
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017.10.30noip赛前集训 | T1 军训排队模拟相关的知识,希望对你有一定的参考价值。
T1 军训排队
【题目描述】
今年招生招了 n 个班。每个班的小学弟小学妹,在操场上面向主席台站成了一列。各个班的新生 随便站成一列,因为他们不懂事,所以也没有间隔一个固定的距离也没有按照一定的顺序(保 证没有两个人在同一个位置)。你和你的好基友便坐在主席台上一边喝水一边看着他们。这 是一个带有升降功能的主席台,它的高度由你决定。当然,这个主席台的高度不能小于 0。 好基友:根据可靠消息,第 i 个班有 ai 个人。为什么我们看不全这么多人? 你:你读书读傻了吧。他们身高不一样,挡住了呗。 好基友:好哥们~这里是他们的体检表。第 i 个班有 ai 份,按照学号从 1 到 ai 整理好 了,上面有他们的身高体重三围。老师也上报了目前大家所在的位置。你能不能立刻告诉我 从我们现在的角度来看可以看见多少人? 为了解决好基友的问题,你需要写一个程序。
【数据范围】
对于 60%的数据, n≤ 5,ai≤ 1000,0≤ xj≤ 1W,0<hj≤1W,0<T≤ 10,0<A≤ 10;
对于 100%的数据, n ≤ 5,ai≤ 3000,0≤ xj≤ 10W,0<hj≤ 10W,0<T≤ 10,0<A≤ 10
【题解】
只要按照位置从近到远排个序,然后计算每个人的影子最远到哪里。
如果后一个人的影子没有被前一个人的影子挡住,就能够看见他。
反之则不能,此时我们只要取最长的那个影子然后继续比较即可。
#include <cstdio> #include <algorithm> const int MAXN = 3000 + 7; int n, m, ans; double a, b, i; char ch; struct Node { double high, from, next; bool operator < (Node d) { return from < d.from; } } node[MAXN]; int main() { freopen("profit.in", "r", stdin); freopen("profit.out", "w", stdout); scanf("%d", &n); while (n--) { for (int i = 1; i <= n; i++) node[i].from = 0, node[i].high = 0, node[i].next = 0; scanf("%d", &m); for (int i = 1; i <= m; i++) scanf("%lf%lf", &node[i].from, &node[i].high); scanf("%lf%c%lf", &a, &ch, &b); for (int i = 1; i <= m; i++) node[i].next = node[i].from + node[i].high / a * b; std::sort(node + 1, node + m + 1); ans = 0; int last = node[1].next; for (int i = 2; i <= m; i++) { if (node[i].next <= last) continue; ans++; last = node[i].next; } printf("%d\n", ans + 1); } return 0; }
以上是关于2017.10.30noip赛前集训 | T1 军训排队模拟的主要内容,如果未能解决你的问题,请参考以下文章
牛客网NOIP赛前集训营-提高组(第四场)B 区间(单调优化)