【枚举】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根火柴棍必须全部用上

Image:Noip08match.jpg

 

题目思路:

  【枚举】

  其实这题很水,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 0x7f7f7f7f
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 */
View Code

 

智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告