目录
牛客OR57 手套
解析代码
本题的意思是随意取出的手套至少可以形成一组组合的最少手套数量。题目给的两个数组对应位置表示同一种颜色的左右手套数量。
对于非0递增序列a1,a2...an,要想最终取值覆盖每一个种类 n = sum(a1...an) - a1 + 1(也就是总数减去最小值之后加一) 所以对于左右手手套颜色都有数量的序列,想要覆盖每一种颜色,则最小数量leftsum = 左边数量和 - 左边最小值 + 1, rightsum = 右边数量和 - 右边的最小值 + 1。而对于有0存在的,则需要做累加,保证覆盖每一种颜色。
class Gloves {
public:
int findMinimum(int n, vector<int> left, vector<int> right) {
int ret = 0;
int left_cnt = 0, right_cnt = 0;
int left_min = INT_MAX, right_min = INT_MAX;
for (int i = 0; i < n; ++i)
{
if (left[i] == 0)
{
ret += right[i];
}
else if (right[i] == 0)
{
ret += left[i];
}
else
{
left_cnt += left[i];
right_cnt += right[i];
left_min = min(left[i], left_min);
right_min = min(right[i], right_min);
}
}
ret += min(left_cnt - left_min, right_cnt - right_min);
return ret + 2; // 全部情况拿完,再左右各拿一个
}
};