题解
农场主的牛
1 条题解
-
0
解题思路
农场主有 n 头牛,每头牛的重量按编号记在数组里。现在要卖掉重量为 w 的一头牛,卖出后剩下的牛编号要保持连续,也就是要把它从数组里删掉,后面的牛往前补位。
做法分四步:
- 把 n 头牛的重量读入数组
a[1]~a[n]。 - 读入要卖掉的牛的重量 w。
- 找牛的编号:从第 1 头牛开始往后找,第一头重量等于 w 的牛就是它。注意牛的重量可能重复,题目要卖的是第一头重量为 w 的牛,所以找到后要立刻
break停下来,否则继续扫会把编号记成后面那头的。 - 删除并输出:先输出这头牛的编号 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)。
- 把 n 头牛的重量读入数组
- 1