牛客题解 | 分苹果
1.牛客题解 | 几个岛2.牛客题解 | 分割后处理3.牛客题解 | 分布式集群消息传递4.牛客题解 | 分玩具5.牛客题解 | 分田地6.牛客题解 | 分石头
7.牛客题解 | 分苹果
8.牛客题解 | 分贝壳9.牛客题解 | 列表补全10.牛客题解 | 删数11.牛客题解 | 删除公共字符12.牛客题解 | 删除重复字符13.牛客题解 | 删除重复字符_114.牛客题解 | 判断一棵满二叉树是否为二叉搜索树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.牛客题解 | 堆棋子_149.牛客题解 | 塔50.牛客题解 | 外卖满减51.牛客题解 | 多数组中位数52.牛客题解 | 多数组第 K 小数53.牛客题解 | 大家来扫雷54.牛客题解 | 大巴车(数组分块,按块翻转,块内不变)55.牛客题解 | 大数乘法56.牛客题解 | 大整数相乘57.牛客题解 | 头条校招58.牛客题解 | 奇数位丢弃59.牛客题解 | 奖学金60.牛客题解 | 奶牛编号61.牛客题解 | 好奇的薯队长62.牛客题解 | 如何添加运算符63.牛客题解 | 字母交换64.牛客题解 | 字母卡片65.牛客题解 | 字母数字混合排序66.牛客题解 | 字符串中找出连续最长的数字串67.牛客题解 | 字符串交错组成68.牛客题解 | 字符串价值69.牛客题解 | 字符串分割70.牛客题解 | 字符串匹配71.牛客题解 | 字符串压缩算法72.牛客题解 | 字符串复制73.牛客题解 | 字符串提取74.牛客题解 | 字符串旋转75.牛客题解 | 字符串是否由子串拼接76.牛客题解 | 字符串替换77.牛客题解 | 字符串替换_178.牛客题解 | 字符串最小变换次数79.牛客题解 | 字符串的排列80.牛客题解 | 字符串的旋转81.牛客题解 | 字符串相乘82.牛客题解 | 字符串组合83.牛客题解 | 字符串计数84.牛客题解 | 字符串距离85.牛客题解 | 字符串连连看86.牛客题解 | 字符串通配87.牛客题解 | 字符串问题88.牛客题解 | 字符混编89.牛客题解 | 字符编码90.牛客题解 | 字符覆盖91.牛客题解 | 字符迷阵92.牛客题解 | 字符迷阵_193.牛客题解 | 字符集合94.牛客题解 | 孙悟空的徒弟95.牛客题解 | 学数学96.牛客题解 | 安置路灯97.牛客题解 | 完成括号匹配98.牛客题解 | 实现字通配符*99.牛客题解 | 密码检查100.牛客题解 | 密码破译题目
解题思路
这是一个贪心算法问题。首先需要判断是否可以平分苹果,然后计算最少需要的移动次数。
关键点:
- 判断是否可以平分苹果:
- 总苹果数必须能被奶牛数整除
- 每次只能移动2个苹果,所以每头奶牛与平均值的差必须是偶数
- 计算最少移动次数:
- 统计高于平均值的奶牛多出的苹果数
- 每次移动2个苹果,所以需要除以2
算法步骤:
- 计算总苹果数和平均值
- 检查是否可以平分
- 计算需要移动的苹果数
- 计算最少移动次数
代码
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int solve(int n, vector<int>& apples) {
// 计算总苹果数和平均值
int total = accumulate(apples.begin(), apples.end(), 0);
if (total % n != 0) {
return -1;
}
int avg = total / n;
int extra = 0; // 记录需要移动的苹果数
// 检查每头奶牛
for (int apple : apples) {
int diff = apple - avg;
if (diff % 2 != 0) { // 差值必须是偶数
return -1;
}
if (diff > 0) { // 统计需要移出的苹果数
extra += diff;
}
}
// 每次移动2个苹果
return extra / 2;
}
};
int main() {
int n;
cin >> n;
vector<int> apples(n);
for (int i = 0; i < n; i++) {
cin >> apples[i];
}
Solution solution;
cout << solution.solve(n, apples) << endl;
return 0;
}
import java.util.*;
public class Main {
static class Solution {
public int solve(int n, int[] apples) {
// 计算总苹果数和平均值
int total = 0;
for (int apple : apples) {
total += apple;
}
if (total % n != 0) {
return -1;
}
int avg = total / n;
int extra = 0; // 记录需要移动的苹果数
// 检查每头奶牛
for (int apple : apples) {
int diff = apple - avg;
if (diff % 2 != 0) { // 差值必须是偶数
return -1;
}
if (diff > 0) { // 统计需要移出的苹果数
extra += diff;
}
}
// 每次移动2个苹果
return extra / 2;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] apples = new int[n];
for (int i = 0; i < n; i++) {
apples[i] = sc.nextInt();
}
Solution solution = new Solution();
System.out.println(solution.solve(n, apples));
sc.close();
}
}
class Solution:
def solve(self, n: int, apples: list) -> int:
# 计算总苹果数和平均值
total = sum(apples)
if total % n != 0:
return -1
avg = total // n
moves = 0
extra = 0 # 记录需要移动的苹果数
# 检查每头奶牛
for apple in apples:
diff = apple - avg
if diff % 2 != 0: # 差值必须是偶数
return -1
if diff > 0: # 统计需要移出的苹果数
extra += diff
# 每次移动2个苹果
return extra // 2
# 读取输入
n = int(input())
apples = list(map(int, input().split()))
solution = Solution()
print(solution.solve(n, apples))
算法及复杂度
时间复杂度
- 计算总和和检查每头奶牛:
- 总时间复杂度:
空间复杂度
- 只需要常数额外空间:
正确性证明
- 如果总苹果数不能被奶牛数整除,显然无解
- 如果某头奶牛与平均值的差不是偶数,由于每次只能移动2个苹果,也无解
- 统计所有高于平均值的奶牛多出的苹果数,除以2即为最少移动次数
- 因为每次移动2个苹果
- 多出的苹果必须移动到缺少苹果的奶牛那里
- 由于总数平衡,多出的苹果数等于缺少的苹果数
合集:
牛客笔试大厂真题题解2
分类:
牛客笔试大厂真题题解2
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】