目录
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-基础练习 特殊回文数
最近的一些文章都可能会很碎,写到哪里是哪里,过一阵子会具体的整理一遍,这里其它的类型题先往后排一排,因为蓝桥最后考的也就是对题目逻辑的理解能力,也就是dp分析能力了,所以就主要目标定在这里,最近的题目会很散,很多,基本上都是网罗全网的一些dp练习题进行二次训练,准备比赛的学生底子薄的先不建议看啊,当然,脑子快的例外,可以直接跳过之前的一切直接来看即可,只需要你在高中的时候数学成绩还可以那就没啥问题,其实,dp就是规律总结,我们只需要推导出对应题目的数学规律就可以直接操作,可能是一维数组,也可能是二维数组,总体来看二维数组的较多,但是如果能降为的话建议降为,因为如果降为起来你看看时间复杂度就知道咋回事了,那么在这里祝大家能无序的各种看明白,争取能帮助到大家。
资源限制 内存限制:512.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s 问题描述 123321是一个非常特殊的数,它从左边读和从右边读是一样的。 输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。 输入格式 输入一行,包含一个正整数n。 输出格式 按从小到大的顺序输出满足条件的整数,每个整数占一行。 样例输入
52
样例输出
899998 989989 998899
数据规模和约定
1<=n<=54
题解,这个题其实非常的好理解,就是完全对称,并且这个完全对称的各个位数之和加起来等于给定的这个数字。
暴力的不可思议
#include<stdio.h>
int main()
{
int a,b,c,d,e,f,t,all;
scanf("%d",&t);
for(a=1;a<10;a++)
for(b=0;b<10;b++)
for(c=0;c<10;c++)
for(d=0;d<10;d++)
for(e=0;e<10;e++)
{
if(a==e)
if(b==d)
{
all=a+b+c+d+e;
if(all==t)
printf("%d\n",a*10000+b*1000+c*100+d*10+e);
}
}
for(a=1;a<10;a++)
for(b=0;b<10;b++)
for(c=0;c<10;c++)
for(d=0;d<10;d++)
for(e=0;e<10;e++)
for(f=0;f<10;f++)
{
if(a==f)
if(b==e)
if(c==d)
{
all=a+b+c+d+e+f;
if(all==t)
printf("%d\n",a*100000+b*10000+c*1000+d*100+e*10+f);
}
}
return 0;
}
相对平和的暴力一下。
#include <iostream>
using namespace std;
int main()
{
int n,a,b,c,t;
cin>>n;
for(a=1;a<10;a++)
for(b=0;b<10;b++)
for(c=0;c<10;c++)
{
t=a*10001+b*1010+c*100;
if(2*a+2*b+c==n)
cout<<t<<endl;
}
for(a=1;a<10;a++)
for(b=0;b<10;b++)
for(c=0;c<10;c++)
{
t=a*100001+b*10010+c*1100;
if(2*a+2*b+2*c==n)
cout<<t<<endl;
}
return 0;
}
这个题解的比较复杂,并且我们可以看到很多的不太熟悉的函数,这个能保障输出的速度,先将结果存储到缓存中,最后一起输出。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.Comparator;
import java.util.StringTokenizer;
public class Main
{
public static InputReader in=new InputReader(System.in);
public static PrintWriter out =new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException
{
//Queue<Integer> q = new PriorityQueue<>(cmp);
//char aa[]= {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
while(in.hasNext())
{
int n=in.nextInt();
for (int i = 1; i <=9; i++)
{
int a=i*2;
for (int j = 0; j <=9; j++)
{
int b=a+j*2;
for (int j2 = 0; j2 <=9; j2++)
{
int c=b+j2;
if (c==n)
{
System.out.println(i+""+j+""+j2+""+j+""+i);
}
}
}
}
for (int i = 1; i <=9; i++)
{
int a=i*2;
for (int j = 0; j <=9; j++)
{
int b=a+j*2;
for (int j2 = 0; j2 <=9; j2++)
{
int c=b+j2*2;
if (c==n)
{
System.out.println(i+""+j+""+j2+""+j2+""+j+""+i);
}
}
}
}
}
}
static Comparator<Integer> cmp = new Comparator<Integer>() {
public int compare(Integer e1, Integer e2) {
return e2 - e1;
}
};
public static class InputReader
{
private BufferedReader in;
private StringTokenizer Tokenizer;
public InputReader(InputStream stream)
{
in=new BufferedReader(new InputStreamReader(stream),32768);
Tokenizer=null;
}
public String next() throws IOException
{
while(Tokenizer==null || !Tokenizer.hasMoreTokens())
{
Tokenizer=new StringTokenizer(in.readLine());
}
return Tokenizer.nextToken();
}
public int nextInt()throws IOException
{
return Integer.valueOf(next());
}
public String nextLine()throws IOException
{
while(Tokenizer==null || !Tokenizer.hasMoreTokens())
{
Tokenizer=new StringTokenizer(in.readLine(),"\n");
if(!Tokenizer.hasMoreTokens())return "\n";
}
return Tokenizer.nextToken();
}
public BigDecimal nextBigDecimal()throws IOException
{
return new BigDecimal(next());
}
public double nextDouble()throws IOException
{
return Double.valueOf(next());
}
boolean hasNext()
{
while(Tokenizer==null || !Tokenizer.hasMoreTokens())
{
try
{
Tokenizer=new StringTokenizer(in.readLine());
} catch (Exception e)
{
return false;
}
}
return true;
}
}
}
我们简单一点也一样
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args){
//对象声明
Scanner sc = new Scanner(System.in);
//获取所给值
int n = sc.nextInt();
//各位进行声明
int ge, shi, bai, qian, wan, shiWan;
//通过确定的循环范围来进行每个数的判断
for(int i=10000; i<999999; i++){
//分别取出每个数
ge = i % 10;
shi = i / 10 % 10;
bai = i / 100 % 10;
qian = i / 1000 % 10;
wan = i / 10000 % 10;
shiWan = i / 100000 % 10;
//若与所给值不相等,跳过
if(ge+shi+bai+qian+wan+shiWan != n){
continue;
}
//将与所给值相等的数转换为字符串,方便进行5或6位数的判断
String str = ""+i;
//5位数回文数要求首位与末位、次位与次末位相等
if(str.length() == 5 && ge == wan && shi == qian){
System.out.println(i);
}
//6位数回文数则在5位数的要求上添加第三位与倒数第三位相等的条件即可
if(str.length() == 6 && ge == shiWan && shi == wan && bai == qian){
System.out.println(i);
}
}
}
}
用自定义函数来处理一下
import java.util.Scanner;
public class Main {
public static void f(int n) {
for(int i=10000;i<1000000;i++) {
if(i<100000) {
int a,b,c,d,e;
a=i/10000;
b=i/1000%10;
c=i/100%10;
d=i/10%10;
e=i%10;
if(a==e&&b==d&&a+b+c+d+e==n) {
System.out.println(i);
}
}else {
int a,b,c,d,e,f;
a=i/100000;
b=i/10000%10;
c=i/1000%10;
d=i/100%10;
e=i/10%10;
f=i%10;
if(a==f&&b==e&&c==d&&a+b+c+d+e+f==n) {
System.out.println(i);
}
}
}
}
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
int n=input.nextInt();
f(n);
}
}
方法有很多种,自己多捉摸捉摸就更多了。
最少的代码,解决最多的问题。
n = int(input())
for i in range(1,10):
s1 = i * 10001
for j in range(10):
k = n - 2 * (i + j)
if k < 10:
print(s1+j*1010+k*100)
if not n%2:
for i in range(1,10):
s1 = i * 100001
for j in range(10):
k = n//2 - i - j
if k < 10:
print(s1+j*10010+k*1100)
别看题目不复杂,但是代码处理起来还是非常麻烦的,故而我们下一阶段目标是Python语言,让我们的解题速度可以更快,先把Java语言搞明白是为了我们的工作能更顺利。必经绝大多数企业都是用的Java语言来解决各种各样的问题的。