题目链接:HDU6976
题意
Alice 和 Bob 玩一个游戏,有 条直线在 2D 平面上。
Alice 先选择其中的 条直线,然后 Bob 画一条直线 L。Bob 的花费是这条直线 L 与 条直线相交的直线的个数。现在,Alice 想要尽可能的使这个花费大,而 Bob 要使这个花费尽可能小。在双方都采取最有策略的情况下,求 时的花费。
题解
不难想,Alice 会优先选择斜率不同的直线,使得尽可能少的直线平行,Bob 所画的直线 L 一定是与当前平面上斜率相同的直线最多的那条直线平行。
参考代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #define abs(x) x > 0 ? x : -x using namespace std; typedef pair<int, int> pii; const int N = 1e5 + 10; pii a[N]; int cnt[N]; int gcd(int a, int b) { return b == 0? a : gcd(b, a % b); } int main() { int t; scanf("%d", &t); while (t--) { memset(cnt, 0, sizeof(cnt)); int n; scanf("%d", &n); for (int i = 1; i <= n; i++) { int x1, x2, y1, y2; scanf("%d%d%d%d", &x1, &y1, &x2, &y2); int dx = x2 - x1, dy = y2 - y1; if (dx == 0) dy = 1; else if (dy == 0) dx = 1; else { if (dx < 0) dx = -dx, dy = -dy; int g = gcd(abs(dx), abs(dy)); dx /= g, dy /= g; } a[i] = pii(dx, dy); } sort(a + 1, a + 1 + n); int p1, p2; for (p1 = 1; p1 <= n; p1 = p2) { for (p2 = p1; p2 <= n && a[p1] == a[p2]; p2++); for (int k = 1; k <= p2 - p1; k++) cnt[k]++; }
for (p1 = p2 = 1; p1 <= n; p1++) { while (!cnt[p2]) p2++; cnt[p2]--; printf("%d\n", p1 - p2); } } return 0; }
|
复杂度分析


yngcy
夕拾天星,曦携明露
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。