目录
1、鸡兔同笼
2、韩信点兵
3、回文数字 (Java代码)暴力枚举
4、筛选号码
5、完美立方
6、生理周期
附加题:蓝桥杯2021年第十二届省赛真题-最少砝码
1、鸡兔同笼
问题:有鸡兔共50头,共有脚120只。 问 :鸡兔分别的数量?
代码语言:javascript复制//最新新跟学生学的输出缓冲区方法,输出速度提高了好多。
PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out),65536));
题解:
代码语言:javascript复制package test;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class demo {
public static void main(String[] args) {
PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out), 65536));
for (int i = 0; i <= 50; i ) {// 设鸡有i只
int j = 50 - i;// 设兔有j只
if (2 * i 4 * j == 120) {// 鸡有2条腿,兔有4条腿
pw.println("i=" i " " "j=" j);
}
}
pw.close();
}
}
2、韩信点兵
问题:韩信知道部队人数大约1000人左右,具体数字不详,5人一组剩余1人,7个人一组还剩两个人,8个人一组还剩3个人,问:这支部队有多少人?
代码语言:javascript复制package test;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class demo {
public static void main(String[] args) {
PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out), 65536));
for(int i=0;i<2000;i ) {
if(i%5==1 && i%7==2 && i%8==3) {
pw.println("i=" i);
}
}
pw.close();
}
}
3、回文数字 (Java代码)暴力枚举
时间限制: 1Sec 内存限制: 128MB 提交: 17468 解决: 7210
题目描述
观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的。这样的数字叫做:回文数字。 本题要求你找到一些5位或6位的十进制数字。满足如下要求: 该数字的各个数位之和等于输入的整数。
输入
一个正整数 n (10< n< 100), 表示要求满足的数位和。
输出
若干行,每行包含一个满足要求的5位或6位整数。 数字按从小到大的顺序排列。 如果没有满足条件的,输出:-1
样例输入复制
代码语言:javascript复制44
样例输出复制
代码语言:javascript复制99899
499994
589985
598895
679976
688886
697796
769967
778877
787787
796697
859958
868868
877778
886688
895598
949949
958859
967769
976679
985589
994499
题解:
代码语言:javascript复制package test;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Scanner;
public class demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out), 65536));
int n = sc.nextInt();
sc.close();
int a, b, c, d, e, f;
int flag = 0;
for (int i = 10000; i <= 999999; i ) {
int s = 0;
if (i <= 99999) {
int b1 = i / 10000;
int c1 = i / 1000 % 10;
int d1 = i / 100 % 10;
int e1 = i / 10 % 10;
int f1 = i % 10;
if (b1 == f1 && c1 == e1) {
s = b1 c1 d1 e1 f1;
}
} else {
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) {
s = a b c d e f;
}
}
if (s == n) {
pw.println(i);
flag = 1;
}
}
if (flag == 0) {
pw.println("-1");
}
pw.close();
}
}
4、筛选号码
有n个人围成一圈,顺序排号(编号为1到n)。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子。从下一个人开始继续报数,直到剩下最后一个人,游戏结束。
问最后留下的是原来第几号的那位。
举个例子,8个人围成一圈:
1 2 3 4 5 6 7 8
第1次报数之后,3退出,剩下:
1 2 4 5 6 7 8 (现在从4开始报数)
第2次报数之后,6退出,剩下:
1 2 4 5 7 8 (现在从7开始报数)
第3次报数之后,1退出,剩下:
2 4 5 7 8 (现在从2开始报数)
第4次报数之后,5退出,剩下:
2 4 7 8 (现在从7开始报数)
第5次报数之后,2退出,剩下:
4 7 8 (现在从4开始报数)
第6次报数之后,8退出,剩下:
4 7 (现在从4开始报数)
最后一次报数之后,4退出,剩下:
7.
所以,最后留下来的人编号是7。
Input
输入描述:
一个正整数n,(1<n<10000)
输入样例:
代码语言:javascript复制8
Output
输出描述:
一个正整数,最后留下来的那个人的编号。
输出样例:
代码语言:javascript复制7
题解:
代码语言:javascript复制package test;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Scanner;
public class demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out), 65536));
int n = sc.nextInt();
sc.close();
int nums[] = new int[n 1];
int t = 0;
int index = 0;
while (true) {
for (int i = 1; i <= n; i ) {
if (nums[i] != 1) {
t ;
}
if (t % 3 == 0) {
nums[i] = 1;
}
}
int sum = 0;
for (int i = 1; i <= n; i ) {
if (nums[i] == 0) {
sum = 1;
index = i;
}
}
if (sum == 1) {
break;
}
}
pw.println(index);
pw.close();
}
}
5、完美立方
形如a3= b3 c3 d3的等式被称为完美立方等式。例如123= 63 83 103 。编写一个程序,对任给的正整数N (N≤100),寻找所有的四元组(a, b, c, d),使得a3 = b3 c3 d3,其中a,b,c,d 大于 1, 小于等于N,且b<=c<=d。
输入:
一个正整数N (N≤100)。
输出:
每行输出一个完美立方。输出格式为: Cube = a, Triple = (b,c,d) 其中a,b,c,d所在位置分别用实际求出四元组值代入。 请按照a的值,从小到大依次输出。当两个完美立方等式中a的值相同,则b值小的优先输出、仍相同则c值小的优先输出、再相同则d值小的先输出。
样例输入:
代码语言:javascript复制24
样例输出:
代码语言:javascript复制Cube = 6, Triple = (3,4,5)
Cube = 12, Triple = (6,8,10)
Cube = 18, Triple = (2,12,16)
Cube = 18, Triple = (9,12,15)
Cube = 19, Triple = (3,10,18)
Cube = 20, Triple = (7,14,17)
Cube = 24, Triple = (12,16,20)
最新新跟学生学的输出缓冲区方法,输出速度提高了好多。
代码语言:javascript复制PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out),65536));
代码语言:javascript复制package test;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Scanner;
public class demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out),65536));
int N = sc.nextInt();
sc.close();
for (int a = 2; a <= N; a ) {
for (int b = 2; b < a; b ) {
for (int c = b; c < a; c ) {
for (int d = c; d < a; d ) {
if (a * a * a == b * b * b c * c * c d * d * d) {
pw.printf("Cube= %d, Triple(%d, %d, %d)n", a, b, c, d);// 格式化输出
}
}
}
}
}
pw.close();
}
}
6、生理周期
总时间限制: 1000ms 内存限制: 65536kB 描述 人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集中。因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天。对于每个人,我们想知道何时三个高峰落在同一天。对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定是第一次高峰出现的时间)。你的任务是给定一个从当年第一天开始数的天数,输出从给定时间开始(不包括给定时间)下一次三个高峰落在同一天的时间(距给定时间的天数)。例如:给定时间为10,下次出现三个高峰同天的时间是12,则输出2(注意这里不是3)。
输入 一行,包含四个整数:p, e, i和d,相邻两个整数之间用单个空格隔开。 p, e, i分别表示体力、情感和智力高峰出现的时间(时间从当年的第一天开始计算)。d 是给定的时间,可能小于p, e, 或 i。 所有给定时间是非负的并且小于等于365, 所求的时间小于等于21252。 输出 一个整数,即从给定时间起,下一次三个高峰同天的时间(距离给定时间的天数)。 样例输入
代码语言:javascript复制4 5 6 7
样例输出
代码语言:javascript复制16994
编码:
代码语言:javascript复制package test;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Scanner;
public class demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out), 65536));
int p, e, i, d;
p = sc.nextInt();
e = sc.nextInt();
i = sc.nextInt();
d = sc.nextInt();
sc.close();
int day = d 1;
for (; (day - p) % 23 != 0; day );
for (; (day - e) % 28 != 0; day = 23);
for (; (day - i) % 33 != 0; day = 23 * 28);
int find = day - d;
pw.println(find);
pw.close();
}
}
附加题:蓝桥杯2021年第十二届省赛真题-最少砝码
题目描述 你有一架天平。现在你要设计一套砝码,使得利用这些砝码可以称出任意小于等于 N 的正整数重量。那么这套砝码最少需要包含多少个砝码? 注意砝码可以放在天平两边。 输入包含一个正整数 N。 输出一个整数代表答案。 样例输入 7 样例输出 3 提示 【样例说明】 3 个砝码重量是 1、4、6,可以称出 1 至 7 的所有重量。 1 = 1; 2 = 6 4 (天平一边放 6,另一边放 4); 3 = 4 1; 4 = 4;
5 = 6 1; 6 = 6; 7 = 1 6; 少于 3 个砝码不可能称出 1 至 7 的所有重量。 【评测用例规模与约定】 对于所有评测用例,1 ≤ N ≤ 1000000000。
题解:
代码语言:javascript复制package test;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Scanner;
public class demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out), 65536));
int num = sc.nextInt();
sc.close();
int n=1;
int w=1;
int ans=1;
while((n w)<num) {
n =w;
w*=3;
ans ;
}
System.out.println(ans);
pw.close();
}
}
有一定的暴力难度,但是难度都是可以接收的哦。慢慢做,别急,都能做出来。