【每天例题】手套
手套
题目

题目要求
1.颜色种数n(1≤n≤13)
2.同时给定两个长度为n的数组left,right,分别代表每种颜色左右手手套的数量。
3.数据保证左右的手套总数均不超过26
思路分析
1.全部拿走左边的手套,然后随意拿走右边一个手套。
2.全部拿走右边的手套,然后随意拿走左边一个手套。
但是这两种方法都有其局限性,比如说,1的拿走的右手手套在左手这边没有对应的手套,2同理。
方法:
全部拿走再减去最少的手套数再加上1,但是这个最少的手套数目不能为0,如果某个颜色没有手套,就必须把该颜色对应的另一边手套累加起来。
先计算出左右手手套的总数,然后再减去各自颜色的最少数再加1,这样可以保证取出的手套每一种颜色至少有一只,计算总数的时候,要找出手套数量最少的颜色,比较两者之间较小的数,以此来决定取左手还是右手,然后再加上另一种手套的另一只。即sum-min+1+1
代码
#include
int main()
{
int n, left[13], right[13];
int i, j;
scanf( "%d" , &n);
for (i = 0; i < n; i++)
{
scanf( "%d" , &left[i]);
scanf( "%d" , &right[i]);
}
int count = 0, leftsum = 0, rightsum = 0;
int leftmin = 1000, rightmin = 1000;
for (i = 0; i < n; i++)
{
if (left[i]*right[i] == 0)
{
count += (left[i] +right[i]); //若某一边的手套数目为0,则加上对应颜色的另一边手套的数目
}
else
{
leftmin = leftmin < left[i] ? leftmin : left[i];
/*
if(leftmin>left[i])
{
leftmin=left[i];
}
*/
rightmin = rightmin < right[i] ? rightmin : right[i];
/*
if(rightmin>right[i])
{
rightmin=right[i];
}*/
leftsum += left[i];
rightsum += right[i];
}
}
if ((leftsum - leftmin) > (rightsum - rightmin))
{
count += (rightsum - rightmin + 1) + 1;
}
else
{
count += (leftsum - leftmin + 1) + 1;
}
printf( "%d" , count);
return 0;
}
运行结果


浙公网安备 33010602011771号