top1编程
← 返回题目
题解

农场主的牛

1 条题解

  • 0
    @ 2026-8-5 1:30:41

    解题思路

    农场主有 n 头牛,每头牛的重量按编号记在数组里。现在要卖掉重量为 w 的一头牛,卖出后剩下的牛编号要保持连续,也就是要把它从数组里删掉,后面的牛往前补位。

    做法分四步:

    1. 把 n 头牛的重量读入数组 a[1]~a[n]。
    2. 读入要卖掉的牛的重量 w。
    3. 找牛的编号:从第 1 头牛开始往后找,第一头重量等于 w 的牛就是它。注意牛的重量可能重复,题目要卖的是第一头重量为 w 的牛,所以找到后要立刻 break 停下来,否则继续扫会把编号记成后面那头的。
    4. 删除并输出:先输出这头牛的编号 pos;再把第 pos+1 头到第 n 头牛依次往前移一位(a[i]=a[i+1]),把第 pos 头覆盖掉,最后输出剩下的 n-1 头牛的重量。

    用样例验证:第 5 头牛重量 480 要卖掉,输出编号 5,然后把 444 320 361 往前移,得到 120 200 245 108 444 320 361,和样例一致。

    参考代码

    // P4494 农场主的牛:根据重量找到要卖掉的那头牛,输出它的编号,再输出删掉它后剩下的牛的重量
    #include <iostream>
    using namespace std;
    int a[105];
    
    int main() {
        int n, w;
        cin >> n;                  // 读入牛的数量
        for (int i = 1; i <= n; i++) cin >> a[i];   // 读入每头牛的重量
        cin >> w;                  // 读入要卖掉的牛的重量
        int pos = 1;
        // 找第一头重量等于 w 的牛,记录它的编号 pos(找到后立即停止)
        for (int i = 1; i <= n; i++)
            if (a[i] == w) { pos = i; break; }
        cout << pos << '\n';       // 输出卖掉牛的编号
        // 从 pos 位置开始,后面的重量依次前移一位,把要卖掉的牛覆盖掉
        for (int i = pos; i < n; i++) a[i] = a[i + 1];
        // 输出剩下的 n-1 头牛的重量
        for (int i = 1; i <= n - 1; i++) cout << a[i] << ' ';
        cout << '\n';
        return 0;
    }
    

    复杂度分析

    • 查找要卖的牛,最多把 n 头牛扫一遍:O(n)。
    • 删除时前移元素,最多移动 n 个:O(n)。
    • 输出 n-1 个数:O(n)。

    总时间复杂度 O(n),空间复杂度 O(n)。

    • 1