zoukankan      html  css  js  c++  java
  • C++枚举算法

    枚举算法

    什么是枚举?
      枚举,顾名思义,就是用最笨的方法,去解决问题(暴力枚举),一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。

    枚举算法是我们在日常中使用到的最多的一个算法,它的核心思想就是:

    枚举所有的可能
    枚举法的本质就是从所有候选答案中去搜索正确的解,使用该算法需要满足两个条件:(1)可预先确定候选答案的数量;(2)候选答案的范围在求解之前必须有一个确定的集合。
    接下来几道题可以让你更加的了解枚举

    1.楼层编号
    题目描述:

    小林在NOIP比赛期间住在“新世界”酒店。和其他酒店不一样的是,这个酒店每天都有一个高能的数字t,这个数字在楼层中是不会出现的,以t=3为例,则3、13、31、33等楼层是不存在的,楼层编号为1,2,4,5,……所以实际上的4楼才是3楼
    已知小林预定了编号为m层的房间,并且当天高能数字是t,现在他想知道房间所在的真实楼层是多少
    1
    2
    3
    4
    输入描述

    一行两个整数m和t,1<=m<=100000,0<=t<=9,保证m对t合法
    1
    输出描述

    一行一个整数,表示真实楼层
    1
    样例输入

    14 3

    样例输出

    12

    思路:

    1.包含这个高能数字的楼层一定不会出现,则有算法如下

    bool s(int a,int b){
    while(a!=0){
    if(a%10==b){
    return false;
    }
    a/=10;
    }
    return true;
    }


    2.用for循环对sum进行累加,若不包含高能数字(即s(i,高能数字)=true)则sum++

    for(int i=1;i<=m;i++){
    if(s(i,t)){
    sum++;
    }
    }
    cout<<sum


    代码:

    #include <iostream>
    using namespace std;
    bool s(int a,int b){
    while(a!=0){
    if(a%10==b){
    return false;
    }
    a/=10;
    }
    return true;
    }
    int main(){
    int m,t,sum=0;
    cin>>m>>t;
    for(int i=1;i<=m;i++){
    if(s(i,t)){
    sum++;
    }
    }
    cout<<sum;
    return 0;
    }



    2.冰壶比赛


    题目描述:

    在冰壶比赛中,给出一个目标点P以及一个规定的正整数r。每一局由甲和乙两队轮流投冰壶各8次后,该局比赛结束。此时,哪一方的冰壶最终离目标点P更近,该方得分,另一方不得分。得分方每颗离目标点P距离小于或等于r、位置较另一队所有冰壶都更接近目标点P的冰壶都可以得1分

    比赛最多进行10局。双方之间的某局比赛结束后,落后一方可以弃权。此时,比赛不再进行下去

    已知每一局结束时,双方的每个冰壶离目标点P的距离以及正整数r,请写一个程序判断两队之间每一局比赛的得分,以及总得分

    输入:

    第一行一个正整数r

    以下有若干行(不超过20行),每一行8个正整数(之间用一个空格间隔)

    第二行的第j个数表示第一局比赛结束时,甲方的第j个冰壶距离目标点P的距离

    第三行的第j个数表示第一局比赛结束时,乙方的第j个冰壶距离目标点P的距离

    ……

    第2k行的第j个数表示第k局比赛结束时,甲方的第j个冰壶距离目标点P的距离

    第2k+1行的第j个数表示第k局比赛结束时,乙方的第j个冰壶距离目标点P的距离

    如果有一方中途弃权,则最后一行(偶数行)只有一个整数-1,表示此时发生弃权情况

    输出:

    输出若干行,每行两个整数,中间以一个冒号间隔,表示每一局比赛甲乙双方的比分(甲得分在前)。最后一行有2个整数,中间以一个冒号间隔,表示甲乙双方比赛的最终得分(甲得分在前)

    意思就是,先输入一个“标准”r,有10场比赛,每场比赛打8次,取最好成绩(最近的也就是最小的),再与对手最好成绩比较,比对手低的话一定不得分,比对手高的话还要比标准要小或等于才算得分,也就是说,每场比赛的得分,一定有一方不得分,有可能出现都不得分的情况,若弃权的话直接输出后return 0;即可。最后输出总的比分(计数即可)
    1
    2
    3
    主要还是枚举

    样例输入

    12

    5 60 25 74 71 100 3 93

    66 75 70 66 52 73 67 14

    93 84 74 99 79 64 89 22

    65 5 95 59 80 8 35 61

    65 61 49 60 58 50 32 85

    68 38 96 38 82 64 26 93

    74 92 47 21 97 30 45 78

    44 99 90 27 3 46 55 34

    49 45 83 3 18 1 67 23

    60 47 95 81 17 1 87 85

    18 74 74 84 29 20 27 71

    37 60 26 56 23 65 67 49

    57 7 62 92 52 5 10 69

    46 97 88 28 76 27 66 7

    89 89 94 31 11 20 1 17

    19 48 35 6 77 61 45 21

    52 11 76 70 73 99 85 55

    90 25 20 7 64 24 94 4

    3 43 32 74 10 93 35 77

    77 100 63 91 10 73 22 57

    样例输出

    2:0

    0:2

    0:0

    0:1

    0:0

    0:0

    1:0

    1:0

    0:2

    1:0

    5:5

    样例解释:

    可以看到标准为12,

    第一局,甲最低3,乙最低14,3<14&&3<=12,甲得分,乙不得分

    第二局,甲最低22,乙最低5,5<22&&5<=12,乙得分,甲不得分

    第三局,甲最低32,乙最低26,都没有小于等于标准,都不得分

    。。。。。。

    代码

    #include<iostream>
    #include<string>
    using namespace std;
    int main()
    {
    int r,i,j;
    cin>>r;
    int a[9],b[9],f=0,f1=0,zf=0,zf1=0,min=10000,min1=100000;
    for(i=1;i<=10;i++)
    {
    for(j=1;j<=8;j++)
    {
    cin>>a[j];
    if(a[1]==-1)
    {
    cout<<zf<<':'<<zf1;
    return 0;
    }
    }
    for(j=1;j<=8;j++)
    {
    cin>>b[j];
    }
    for(j=1;j<=8;j++)
    {
    if(a[j]<min)
    {
    min=a[j];
    }
    }
    for(j=1;j<=8;j++)
    {
    if(b[j]<min1)
    {
    min1=b[j];
    }
    }
    if(min<min1)
    {
    for(j=1;j<=8;j++)
    {
    if(a[j]<=r&&a[j]<min1)
    {
    f++;
    }
    }
    cout<<f<<':'<<f1<<endl;
    zf=zf+f;
    f=0;
    }
    else if(min1<min)
    {
    for(j=1;j<=8;j++)
    {
    if(b[j]<=r&&b[j]<min)
    {
    f1++;
    }
    }
    cout<<f<<':'<<f1<<endl;
    zf1=zf1+f1;
    f1=0;
    }
    else
    {
    cout<<0<<':'<<0<<endl;
    }
    min=10000;
    min1=10000;
    }
    cout<<zf<<':'<<zf1;
    return 0;
    }



    这里用到了求最小值的方法,还可以改成sort排序后的[0]

  • 相关阅读:
    flex布局下,将内容限定在容器内(如内容超出以省略号显示)的实现方案
    模板引擎——jquery.tmpl.js
    CSS布局——display: flex
    js实现实时显示当前时间的方法
    PS——规定尺寸的证件照的制作
    辅助开发——ps一键切图篇
    TCP的三次握手和四次挥手
    HTTP 协议基础入门篇总结
    频率组件
    视图组件
  • 原文地址:https://www.cnblogs.com/AK-IOI/p/12726284.html
Copyright © 2011-2022 走看看