做题笔记 CF680A 【Bear and Five Cards】

有一说一这题真的不用那么麻烦


solution

注意到题目中的 \(1\leq t_i\leq 100\) ,这意味着我们可以保存每个数出现的次数,然后遍历每个数,对应到她出现的次数,然后更新答案。

具体算法流程:

  1. 读入 \(a_{1..5}\) ,同时统计信息:sum 代表5个数的总和,\(t_{a_i}\) 代表这个数出现的次数,pd用于判断是否存在没有任何数能够去除的情况,也就是每次加上当前的 \(t_{a_i}\) ,如果所有数都只是出现了一次那么必然有pd==5
  2. 判断 pd 是否等于 5 :如果等于5,那么说明没有任何数能够去除,直接输出 sum 即可;
  3. 判断这5个数,每次对应到 \(t_{a_i}\) ,若 \(t_{a_i}=2\) ,那么设 \(f=sum-a_i*t_{a_i}\) ,并取 \(\min(f,ans)\) 。其中 ans 为和的最小值;若 \(t_{a_i}>2\) ,根据题目,最多只能去除 3 个数,所以设 \(f=sum-a_i\times 3\),同样取 \(\text{min}(f,ans)\)
  4. 最后输出 ans 即可。

参考代码:

#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;

int main(void)
{
    int a[61], t[101]={}, sum=0, pd=0;
    for(int i=1;i<=5;i++)
    {
        scanf("%d", &a[i]);
        sum += a[i];
        t[a[i]]++;
        pd += t[a[i]];
    }

    if(pd==5) {printf("%d\n", sum);return 0;}

    int ans=233333333;
    //取和的最小值,所以一开始是无穷大
    for(int i=1;i<=5;i++)
    {
        if(t[a[i]]==2)
        {
            int f = sum-a[i]*t[a[i]];
            ans=min(ans, f);
        }
        else if(t[a[i]]>2)
        {
            int f = sum-a[i]*3;
            ans=min(ans, f);
        }
    }
    printf("%d\n", ans);

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/BlueInRed/p/12617532.html