1 条题解

  • 0
    @ 2025-10-8 16:58:02
    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 1000 + 5; // 为了方便定义数组,直接把数据范围控制好
    long long a[maxn], b[maxn], c, d; // a,b表示奶牛计入房间位置,c,d表示座位位置
    int flag[maxn]; // 用来标记那些奶牛已经有座位了
    int pos; // 记录有座位的奶牛编号
    
    int main() {
        int n, m;
        cin >> n >> m;
        for (int i = 1; i <= n; i++)
            cin >> a[i] >> b[i];
        for (int j = 1; j <= m; j++) {
            cin >> c >> d;
            long long dis = 0; // 计算当前奶牛到座位的距离,用勾股定理(因为只需要比较,所以没有开根号)
            long long mindis = 1e15; // 记录当前最小奶牛距桌子距离(开始随便赋值,大一些)
            for (int i = 1; i <= n; i++) {
                if (flag[i] == 1) continue; // 已有座位,直接跳过
                dis = (a[i] - c) * (a[i] - c) + (b[i] - d) * (b[i] - d); // 计算距离,用勾股定理
                if (dis < mindis) { // 如果刷新了最小纪录
                    mindis = dis; // 重新赋最小值
                    pos = i; // 标记
                }
            }
            flag[pos] = 1; // 标记,已有座位
        }
        if (n == m) { // 特判没有奶牛无座位
            cout << 0;
            return 0;
        }
        for (int i = 1; i <= n; i++) { // 其他情况输出
            if (flag[i]) continue;
            cout << i << endl;
        }
        return 0;
    }
    
    • 1

    *【贪心】牛抢座位[USACO10OCT] Dinner Time S

    信息

    ID
    1584
    时间
    1000ms
    内存
    128MiB
    难度
    8
    标签
    递交数
    186
    已通过
    26
    上传者