【每天例题】手套

手套

题目

https://www.nowcoder.com/practice/365d5722fff640a0b6684391153e58d8?tpId=49&&tqId=29337&rp=1&ru=/activity/oj&qru=/ta/2016test/question-ranking

 

题目要求

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;
}

 运行结果

 

posted @ 2023-04-20 14:57  山远尽成云  阅读(43)  评论(0)    收藏  举报