火柴棒等式(2008年NOIP全国联赛提高组)
2016-11-08 09:11
274 查看
题目描述 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根火柴棍必须全部用上
View Code
给你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根火柴棍必须全部用上
#include<cstdio> #include<iostream> using namespace std; int n,ans; int s[20][3000]; int sh[]={6,2,5,5,4,5,6,3,7,6}; bool v[3000][3000]; void knqk(int x,int y,int z,int en){//搜索x根火柴能擺出哪些數。(恰好用光)//x記錄用的火柴數,y記錄剩餘的火柴數,z記錄擺出的數,en恩。 if(y==0){s[x][++s[x][0]]=z;return;}//滿足條件的數存到s數組中。 for(int i=0;i<10;i++){ if(en>2&&i==0) continue;//沒有會出現000=0(擺多個零還是零)。 if(y>=sh[i]) knqk(x,y-sh[i],z+en*i,en*10); } } int main(){ scanf("%d",&n); n-=4; for(int i=2;i<=n-4;i++) knqk(i,i,0,1); for(int i=2;i<=n-4;i++)//枚舉第一個數用的火柴數。 for(int j=2;j<=n-i-2;j++){//枚舉第二個數用的火柴數。 int k=n-i-j;//確定第三個數用的火柴數。 for(int ii=1;ii<=s[i][0];ii++)//枚舉用i根火柴能擺出的數。 for(int jj=1;jj<=s[j][0];jj++)//枚舉用j根火柴能擺出的數。 for(int kk=1;kk<=s[k][0];kk++){//枚舉用k根火柴能擺出的數。 if(s[i][ii]+s[j][jj]==s[k][kk]&&!v[s[i][ii]][s[j][jj]]){//滿足條件並且此等式未出現過。 ans++; v[s[i][ii]][s[j][jj]]=1;//標記。 } } } printf("%d\n",ans); return 0; }
View Code
其實還有一種代碼較短的思路(記錄擺出某個數用的火柴數),懶得打了~
相关文章推荐
- 【CS 1168】火柴棒等式 2008年NOIP全国联赛提高组
- 【动态规划】CODE[VS] 1169 传纸条【2008年NOIP全国联赛提高组】
- 笨小猴 2008年NOIP全国联赛提高组
- 棋盘型动态规划 之 CODE[VS] 1169 传纸条 2008年NOIP全国联赛提高组
- 3286 火柴排队 2013年NOIP全国联赛提高组
- codevs1170 双栈排序(2008年NOIP全国联赛提高组)
- Codevs 1169 传纸条 2008年NOIP全国联赛提高组
- wikioi 1169 传纸条 (2008年NOIP全国联赛提高组)
- 双栈排序 2008年NOIP全国联赛提高组(二分图染色)
- 笨小猴 2008年NOIP全国联赛提高组
- Code Vs 1169 传纸条 && 2008年NOIP全国联赛提高组
- 火柴排队 2013年NOIP全国联赛提高组
- 1169 传纸条 2008年NOIP全国联赛提高组 个人博客:attack.cf
- 笨小猴 2008年NOIP全国联赛提高组
- Code P3286 火柴排队 2013年NOIP全国联赛提高组
- Codevs 3286 火柴排队 2013年NOIP全国联赛提高组 树状数组,逆序对
- NOIP2016全国信息学分区联赛提高组第二试 蚯蚓
- 划分型动态规划 之 CODE[VS] 1039 数的划分 2001年NOIP全国联赛提高组
- Code Vs 1155 金明的预算方案&& 2006年NOIP全国联赛提高组
- wikioi 1166 矩阵取数游戏(2007年NOIP全国联赛提高组)