P1149 [NOIP2008 提高组] 火柴棒等式 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这题有点小坑,我初次做数据开小了。
我们要用已有火柴数来拼数字,由于我们不清楚可以拼成几位数字,所以我们可以开始模拟,但是暴力枚举来模拟也可以有技巧。我们只需枚举前两个加数,然后计算拼接成这两个加数的所用火柴数量与这两个加数之和的火柴数量之和是否等于我们可以使用的火柴数。
枚举两个加数的时候要注意了,不能盲目枚举,会超时。我们来拆分,我们直到拼成1的火柴数量最少仅仅需要两个,我们假设前两个加数都有1组成,假设第三个和也由1组成(实际和肯定所用的火柴数要大于全是1的火柴数),也就是20除以3,每个加数最大可以为4个1组成,就是1111,所以我们两重for循环到1111即可。
import java.awt.FontFormatException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.lang.reflect.AnnotatedWildcardType;
import java.math.BigInteger;
import java.net.DatagramPacket;
import java.sql.SQLIntegrityConstraintViolationException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Map;
import java.util.Objects;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.Spliterator.OfPrimitive;
import java.util.function.IntToDoubleFunction;
import java.util.function.LongBinaryOperator;
import java.util.TreeMap;
import java.util.TreeSet;
import javax.management.relation.InvalidRelationTypeException;
import javax.print.attribute.standard.JobMessageFromOperator;
import javax.print.attribute.standard.JobPriority;
import javax.swing.plaf.ColorChooserUI;
import javax.swing.table.TableModel;
import javax.swing.text.TabSet;
import javax.xml.crypto.dsig.spec.DigestMethodParameterSpec;
public class Main {
public static void main(String[] args) throws IOException {
Scanner sc=new Scanner(System.in);
BufferedReader br1=new BufferedReader(new InputStreamReader(System.in));
int a=Integer.parseInt(br1.readLine());
aa=new int[10];
aa[0]=6;
aa[1]=2;
aa[2]=5;
aa[3]=5;
aa[4]=4;
aa[5]=5;
aa[6]=6;
aa[7]=3;
aa[8]=7;
aa[9]=6;
int b;
int c;
int answer=0;
for(b=0;b<=1111;b++) {
for(c=0;c<=1111;c++) {
int d=jisuan(b);
int e=jisuan(c);
int f=jisuan(b+c);
if(d+e+f==a-4) {
//System.out.println(b+" "+c+" "+(b+c));
answer++;
}
else {
}
}
}
System.out.println(answer);
}
public static int[] aa;
public static int jisuan(int a) {
int c=0;
if(a==0) {
c=c+aa[0];
}
while(a>0) {
int b=a%10;
a=a/10;
c=c+aa[b];
}
return c;
}
}