zoukankan      html  css  js  c++  java
  • 做题笔记 CF680A 【Bear and Five Cards】

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


    solution

    注意到题目中的 (1leq t_ileq 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 imes 3),同样取 ( ext{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
    ", 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
    ", ans);
    
        return 0;
    }
    
  • 相关阅读:
    Yii2安装任务调度扩展
    分享书籍[writing idiomatic python ebook]
    python待解决问题笔记
    dojo使用笔记: 自定义ConfirmDialog
    dojo使用疑难杂症集锦
    学习"大众点评网的架构设计与实践"
    一个前端html模板处理引擎(javascript)
    日历设计之重复事件规则设计
    TCP/IP之TCP的建立与终止
    python正则表达式
  • 原文地址:https://www.cnblogs.com/BlueInRed/p/12617532.html
Copyright © 2011-2022 走看看