zoukankan      html  css  js  c++  java
  • 【算法学习笔记】64. 枚举法 SJTU OJ 1381 畅畅的牙签

    枚举法就好了,推理很麻烦,感觉也做不出来。

    创造一个结构体,一个是真实的数,一个是花费的牙签数。

    构建一位数,两位数,三位数即可。

    #include <iostream>
    #include <vector>
    using namespace std;
    //从0到9耗费的牙签数
    int cost[10]={6,2,5,5,4,5,6,3,7,6};
    struct num
    {    
        int n;//用于计算的数
        int c;//耗费的牙签
    };
    
    num v[100000];
    int main(int argc, char const *argv[])
    {
        
        int v_size = 0;
        //一位数
        for (int i = 0; i <= 9; ++i)
        {
            num t;
            t.n = i;
            t.c = cost[i];
            v[t.n] = t;
        }
        //两位数
        for (int i = 1; i <=9; ++i)
        {
            for (int j = 0; j <= 9; ++j)
            {
                num t;
                t.n = i*10 + j;
                t.c = v[i].c + v[j].c;
                v[t.n] = t;
            }
        }
        //三位数
        for (int i = 1; i <=9; ++i)
        {
            for (int j = 0; j <= 9; ++j)
            {
                for(int k=0; k <= 9; ++k){
                    num t;
                    t.n = i*100 + j*10 + k;
                    t.c = v[i].c + v[j].c + v[k].c;
                    v[t.n] = t;
                }
            }
        }
    
        int total  = 0; //一共的答案数
        cin>>total;
        int ans =  0;
        //枚举A - B 计算C 和 cost
        for (int i = 999; i >=0; --i)
        {
            for (int j = 0; j <= i; ++j)
            {
                int k =  v[i].n - v[j].n;
                int cost = 3 + v[i].c + v[j].c + v[k].c;
                if(cost == total){
                    //cout<<i<<"-"<<j<<"="<<k<<endl;
                    ans++;
                }
            }
        }
        cout<<ans<<endl;
    
        return 0;
    }
  • 相关阅读:
    sort()函数与qsort()函数
    个人作业——软件工程实践总结作业
    个人作业——软件评测
    软件工程实践2019第五次作业
    软件工程实践2019第四次作业
    软件工程实践2019第三次作业
    软件工程实践2019第二次作业
    期末大作业
    第7次实践作业
    第6次实践作业
  • 原文地址:https://www.cnblogs.com/yuchenlin/p/sjtu_oj_1381.html
Copyright © 2011-2022 走看看