Vijos P1496 火柴棒等式 【NOIP2008提高组第二题】

题目链接:https://vijos.org/p/1496

题目大意:

  给你n(n<24)根火柴棍,你可以拼出多少个形如“A+B=C”的等式?("+"和"="各自需要两根火柴棍)

  如果A≠B,则A+B=C与B+A=C视为不同的等式(A、B、C>=0)

  n根火柴棍必须全部用上

题目思路:

  其实这题很水,n最大才24,扣掉+和=就只有20,直接枚举就行。

  稍微算一下就知道每个数最大不会超过1111

  两层for枚举每个数,判断是否用尽火柴即可。

 

 1 //
 2 //by coolxxx
 3 //
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<string>
 7 #include<iomanip>
 8 #include<memory.h>
 9 #include<time.h>
10 #include<stdio.h>
11 #include<stdlib.h>
12 #include<string.h>
13 #include<stdbool.h>
14 #include<math.h>
15 #define min(a,b) ((a)<(b)?(a):(b))
16 #define max(a,b) ((a)>(b)?(a):(b))
17 #define abs(a) ((a)>0?(a):(-(a)))
18 #define lowbit(a) (a&(-a))
19 #define sqr(a) (a)*(a)
20 #define swap(a,b) (a)^=(b),(b)^=(a),(a)^=(b)
21 #define eps 1e-8
22 #define S 10000
23 #define MAX 2139062143
24 #define PI 3.1415926535897
25 #define N 34
26 #define M 1111
27 using namespace std;
28 int n,m,cas,lll,ans;
29 int a[4];
30 int r[10]={6,2,5,5,4,5,6,3,7,6};
31 int cal(int aa)
32 {
33     cas=0;
34     if(aa==0)return 6;
35     for(cas=0;aa;aa/=10)
36         cas+=r[aa%10];
37     return cas;
38 }
39 void work()
40 {
41     int i,j,x,y,z;
42     for(i=0;i<M;i++)
43     {
44         x=cal(i);
45         if(x>=n-1)continue;
46         z=cal(i+i);
47         if(x+x+z==n)
48         {
49             ans++;
50             //printf("%d+%d=%d\n",i,i,i+i);
51         }
52         for(j=i+1;j<=M;j++)
53         {
54             y=cal(j);
55             if(x+y>=n-1)continue;
56             z=cal(i+j);
57             if(x+y+z==n)
58             {
59                 ans+=2;
60                 //printf("%d+%d=%d\n",i,j,i+j);
61             }
62         }
63     }
64 }
65 int main()
66 {
67     #ifndef ONLINE_JUDGE
68 //    freopen("1.txt","r",stdin);
69 //    freopen("2.txt","w",stdout);
70     #endif
71     int i,j,k;
72 //    while(~scanf("%s",s))
73     while(~scanf("%d",&n) && n)
74     {
75         ans=0;
76         n-=4;
77         work();
78         printf("%d\n",ans);
79     }
80     return 0;
81 }
82
83
84 /*
85 //
86
87 //
88 */

时间: 2024-10-12 20:21:53

Vijos P1496 火柴棒等式 【NOIP2008提高组第二题】的相关文章

洛谷-火柴棒等式-NOIP2008提高组复赛

题目描述 Description 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 1. 加号与等号各自需要两根火柴棍 2. 如果A≠B,则A+B=C与B+A=C视为不同的等式(A.B.C>=0) 3. n根火柴棍必须全部用上 输入输出格式 Input/output 输入格式: 输入文件matches.in共一行,又一个整数n(n<=24). 输出格式: 输出文件mat

Luogu p1149 / Vijos p1496 火柴棒等式

给你n根火柴棍,你可以拼出多少个形如"A+B=C"的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 加号与等号各自需要两根火柴棍 如果A≠B,则A+B=C与B+A=C视为不同的等式(A.B.C>=0) n根火柴棍必须全部用上 输入输出格式 输入格式: 输入文件matches.in共一行,又一个整数n(n<=24). 输出格式: 输出文件matches.out共一行,表示能拼成的不同等式的数目. 输入

【动态规划】Vijos P1493 传纸条(NOIP2008提高组第三题)

题目链接: https://vijos.org/p/1493 题目大意: 二取方格数,从(1,1)向下或向右走到(n,m)走两次,每个走到的格子值只能被取一次所能取到的最大值. (n,m<=50) 题目思路: [动态规划] f[i][j][k][l]表示第一次走到(i,j)第二次走到(k,l)的最大值. 分别向上或向左转移. 1 // 2 //by coolxxx 3 //#include<bits/stdc++.h> 4 #include<iostream> 5 #incl

唯一分解定理的应用: NOIP2009 提高组第二题Hankson [唯一分解定理|暴力]

输入输出格式 输入格式: 第一行为一个正整数 n,表示有 n 组输入数据.接下来的 n 行每 行一组输入数据,为四个正整数 a0,a1,b0,b1,每两个整数之间用一个空格隔开.输入 数据保证 a0 能被 a1 整除,b1 能被 b0 整除. 输出格式: 输出文件 son.out 共 n 行.每组输入数据的输出结果占一行,为一个整数. 对于每组数据:若不存在这样的 x,请输出 0: 若存在这样的 x,请输出满足条件的 x 的个数: 输入输出样例 输入样例#1: 2 41 1 96 288 95

欧几里得算法以及扩展欧几里得算法(过河noip2005提高组第二题)

欧几里得算法:也被称作辗转相除法 gcd(a,b)=gcd(b,a%b); 终止条件a=gcd b=0; (gcd为a,b的最大公约数) 扩展欧几里得算法: a 和 b 的最大公约数是 gcd ,一定能够找到这样的 x 和 y ,使得: a*x + b*y = gcd 成立 我们只需要找到特殊解x0,y0; 则通解为 x = x0 + (b/gcd)*t    y = y0 – (a/gcd)*t 那如何求出下一组解呢 仿照欧几里得算法a=b,b=a%b代入. a%b = a - (a/b)*b

NOIP2014提高组第二题联合权值

还是先看题吧: 试题描述  无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi ,每条边的长度均为 1.图上两点(u, v)的距离定义为 u 点到 v 点的最短距离.对于图 G 上的点对(u, v),若它们的距离为 2,则它们之间会产生Wu * Wv 的联合权值.请问图 G 上所有可产生联合权值的有序点对中,联合权值最大的是多少?所有联合权值之和是多少? 输入 第一行包含 1 个整数 n.接下来 n-1 行,每行包含 2 个用空格隔开的正整数 

TYVJ P1012 火柴棒等式 Label:枚举

背景 NOIP2008年提高组第二题 描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示:注意:1. 加号与等号各自需要两根火柴棍2. 如果A≠B,则A+B=C与B+A=C视为不同的等式(A.B.C>=0)3. n根火柴棍必须全部用上 输入格式 输入文件matches.in共一行,又一个整数n(n<=24). 输出格式 输出文件matches.out共一行,表示能拼成的不同等

noip2008 火柴棒等式

P1149 火柴棒等式 1.9K通过 3.7K提交 题目提供者该用户不存在 标签搜索/枚举模拟2008NOIp提高组 难度普及- 提交该题 讨论 题解 记录 题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 加号与等号各自需要两根火柴棍 如果A≠B,则A+B=C与B+A=C视为不同的等式(A.B.C>=0) n根火柴棍必须全部用上 输入输出格式 输入格式: 输入

Noip2008提高组总结

Noip2008前三题是基础题,仔细一些都是可以AC的,第四题的证明很巧妙,但是看懂后代码其实很简单,感觉在这些大家都不屑去做的简单题中又学到了不少,四道题代码基本都是十几二十行就够了,渐渐感觉到,比代码和算法更重要的是思想与建模,觉得下阶段应该多注意培养自己的建模能力. T1:火柴棒等式 最简单的模拟题,首先记录下每种数字需要的火柴棒数,最后枚举验证即可. + ? 1 2 3 4 5 6 7 8 9 10 11 #include <cstdio> int main(){     int n,