zoukankan      html  css  js  c++  java
  • [折腾笔记] 洛谷P1149-火柴棒等式 AC记

    原题链接: https://www.luogu.org/problem/P1149

    题面简述:

    给你n根火柴棍,你可以拼出多少个形如A+B=C“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字0-9的拼法如图所示:

    img

    注意:

    1. 加号与等号各自需要两根火柴棍
    2. 如果A≠B,则A+B=C与B+A=C视为不同的等式(A,B,C>=0)
    3. n根火柴棍必须全部用上

    思路:

    等式可能的情况:

    x+y=zx + y = z

    xx+yy=zzxx+yy=zz

    xxx+yyy=zzzxxx+yyy=zzz

    xxxx+yyyy=zzzzxxxx+yyyy=zzzz

    为啥这么说呢?因为计算在极端条件n=24n = 24,的情况下,最高位数是:

    24÷2=1224div 2=12 (如果全部摆11的话,可以摆121211) 12÷3=412div 3=4 一共有33个数,于是最多44位。


    于是,我们大可枚举,因为枚举的话再加上优化,不会超时所以,就可以写出如下代码:

    #include <bits/stdc++.h>
    using namespace std; 
    int s[] = {6,2,5,5,4,5,6,3,7,6};
    int t = 4;
    int ans = 0;
    bool judge(int a,int b,int c,int n) {
        int p = 0;
        string d = to_string(a),e = to_string(b),f = to_string(c);
        for(int i = 0;i<d.length();++i) p+=s[d[i]-'0'];
        for(int i = 0;i<e.length();++i) p+=s[e[i]-'0'];
        for(int i = 0;i<f.length();++i) p+=s[f[i]-'0'];
        if(p==n) {
            return 1;
        }
        return 0;
    }
    int main() {
    	int n;
    	cin>>n;
    	n-=4;
    	for(int i = 0;i<=9999;++i) {
            for(int j = 0;j<=9999;++j) {
                int k = i+j;
                if(i+j==k&&judge(i,j,k,n)) {
                    ans++;
                }
            }
        }
    	cout<<ans<<endl;
    } 
    

    另外之前还犯了个错误:

    #include <bits/stdc++.h>
    using namespace std; 
    int s[] = {6,2,5,5,4,5,6,3,7,6};
    int t = 4;
    int ans = 0;
    bool judge(int a,int b,int c,int n) {
        int p = 0;
        string d = to_string(a),e = to_string(b),f = to_string(c);
        for(int i = 0;i<d.length();++i) p+=s[d[i]-'0'];
        for(int i = 0;i<e.length();++i) p+=s[e[i]-'0'];
        for(int i = 0;i<f.length();++i) p+=s[f[i]-'0'];
        if(p==n) {
            return 1;
        }
        return 0;
    }
    int main() {
    	int n;
    	cin>>n;
    	n-=4;
    	for(int i = 0;i<=n;++i) {
            for(int j = 0;j<=n;++j) {
                int k = i+j;
                if(i+j==k&&judge(i,j,k,n)) {
                    ans++;
                }
            }
        }
    	cout<<ans<<endl;
    } 
    

    这里只枚举到n不够。

  • 相关阅读:
    BZOJ 3236 AHOI 2013 作业 莫队算法
    使用再哈希算法查找元素
    冰雪奇缘--用爱酿就一部经典
    Scrapy系列教程(2)------Item(结构化数据存储结构)
    html学习笔记二
    知方可补不足~sqlserver中触发器的使用
    我心中的核心组件(可插拔的AOP)~调度组件quartz.net
    EF架构~为BulkInsert引入SET IDENTITY_INSERT ON功能
    知方可补不足~sqlserver中使用sp_who查看sql的进程
    知方可补不足~为千万级数据表加索引
  • 原文地址:https://www.cnblogs.com/littlefrog/p/11939499.html
Copyright © 2011-2022 走看看