数组切分(JAVA)
题目:已知一个长度为 N 的数组:A1,A2,A3,…AN 恰好是 1∼N 的一个排列。现 在要求你将 A 数组切分成若干个 (最少一个, 最多 N 个) 连续的子数组, 并且 每个子数组中包含的整数恰好可以组成一段连续的自然数。
例如对于 A=1,3,2,4, 一共有 5 种切分方法:
1324 : 每个单独的数显然是 (长度为 1 的) 一段连续的自然数。
{1}{3,2}{4}:{3,2} 包含 2 到 3 , 是 一段连续的自然数, 另外 1 和 4 显然 也是。
{1}{3,2,4}:{3,2,4} 包含 2 到 4 , 是一段连续的自然数, 另外1 显然也是。
{1,3,2}{4}:{1,3,2} 包含 1 到 3 , 是 一段连续的自然数, 另外 4 显然也是。
{1,3,2,4} : 只有一个子数组, 包含 1 到 4 , 是 一段连续的自然数。
输入格式第一行包含一个整数 N 。第二行包含 N 个整数, 代表 A 数组。
输出格式输出一个整数表示答案。由于答案可能很大, 所以输出其对 1000000007 取 模后的值
样例输入
41 3 2 4
样例输出
5
...
求阶乘(JAVA)
题目:满足 N ! 的末尾恰好有 K 个 0 的最小的 N 是多少?
如果这样的 N 不存在输出 −1 。
输入格式一个整数 K 。
输出格式一个整数代表答案。
样例输入
2
样例输出
10
评测用例规模与约定对于 30% 的数据, 1≤K≤106.
对于 100% 的数据, 1≤K≤1018.
运行限制最大运行时间:3s最大运行内存: 512M
代码:import java.util.Scanner;// 1:无需package// 2: 类名必须Main, 不可修改 public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); long K=sc.nextLong(); //输入K long left=1; //左边界 long right=Long.MAX_VALUE-1; / ...
最少刷题数(JAVA)
题目:小蓝老师教的编程课有 N 名学生, 编号依次是 1…N 。第 i 号学生这学期 刷题的数量是Ai 。
对于每一名学生, 请你计算他至少还要再刷多少道题, 才能使得全班刷题 比他多的学生数不超过刷题比他少的学生数。
输入格式第一行包含一个正整数 N 。
第二行包含 N 个整数:A1,A2,A3,…,AN.
输出格式输出 N 个整数, 依次表示第1…N 号学生分别至少还要再刷多少道题。
样例输入
512 10 15 20 6
样例输出
0 3 0 0 7
评测用例规模与约定对于 30% 的数据, 1≤N≤1000,0≤Ai≤1000.
对于 100% 的数据, 1≤N≤100000,0≤Ai≤100000.
运行限制最大运行时间:1s最大运行内存: 512M
代码:import java.util.Arrays;import java.util.Scanner; public class zui_shao_shua_ti_shu { public static void main(String[] args) { Scanner sc= ...
山(JAVA)
题目:本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
这天小明正在学数数。
他突然发现有些止整数的形状像一挫 “山”, 比如 123565321 ,145541, 它 们左右对称 (回文) 且数位上的数字先单调不减, 后单调不增。
小朋数了衣久也没有数完, 他惒让你告诉他在区间[2022,2022222022] 中有 多少个数的形状像一座 “山”。运行限制
最大运行时间:1s
最大运行内存: 512M
代码:public class shan { public static void main(String[] args) { int sum=0; for (int i=2022;i<=2022222022;i++){ String s=i+""; //将数字转化为字符串也可以用Integer.toString(i) if (huiwen(s)&&dizeng(s)) ...
双向排序(JAVA)
题目:给定序列(a1,a2,⋅⋅⋅,an)=(1,2,⋅⋅⋅,n),即 ai=i。
小蓝将对这个序列进行 m 次操作,每次可能是将 a1,a2,⋯,aqi 降序排列,或者将aqi,aqi+1,⋯,an 升序排列。
请求出操作完成后的序列。
输入描述输入的第一行包含两个整数 n,m,分别表示序列的长度和操作次数。
接下来 m 行描述对序列的操作,其中第 i 行包含两个整数pi,qi 表示操作类型和参数。当pi=0 时,表示将 a1,a2,⋅⋅⋅,aqi 降序排列;当pi=1 时,表示将 aqi,aqi+1,⋯,an 升序排列。
输出描述输出一行,包含 nn 个整数,相邻的整数之间使用一个空格分隔,表示操作完成后的序列。
输入输出样例示例
输入
3 30 31 20 2
输出
3 1 2
样例说明原数列为 (1, 2, 3)(1,2,3)。
第 11 步后为 (3, 2, 1)(3,2,1)。
第 22 步后为 (3, 1, 2)(3,1,2)。
第 33 步后为 (3, 1, 2)(3,1,2)。与第 22 步操作后相同,因为前两个数已经是降序了。
评测用例规模与约定对于 30% ...
杨辉三角形(JAVA)
题目:下面的图形是著名的杨辉三角形:
如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列:1,1,1,1,2,1,1,3,3,1,1,4,6,4,1,⋯
给定一个正整数 N,请你输出数列中第一次出现 N 是在第几个数?
输入描述输入一个整数 N。
输出描述输出一个整数代表答案。
输入输出样例示例 1
输入
6
输出
13
评测用例规模与约定对于 20% 的评测用例,1≤N≤10; 对于所有评测用例,1≤N≤1000000000。
运行限制最大运行时间:1s最大运行内存: 256M
思路:首先我想到的是将杨辉三角形构建出来再进行查找,但N的最大值是1*10^9,经过亲身实践只能通过40%的用例
所以需要找规律
杨辉三角形:
需要考虑的部分:
其中6=c(2,4) 2=c(1,2)因为10^9>c(16,32)但10^9<c(17,34),所以在16列以内肯定能找到所有的数,有效数列是0-16列。又因为每一行都是从左到右递增,每一列都是从上到下递增,每个数字都可以表示为c(i,j)。所以我们可以从十六列开始,逐步往前找采用二分行的方式找到答 ...
路径(JAVA)
题目:本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图 中的最短路径。
小蓝的图由 2021 个结点组成,依次编号 1 至 2021。
对于两个不同的结点 a, b,如果 a 和 b 的差的绝对值大于 21,则两个结点 之间没有边相连;如果 a 和 b 的差的绝对值小于等于 21,则两个点之间有一条 长度为 a 和 b 的最小公倍数的无向边相连。
例如:结点 1 和结点 23 之间没有边相连;结点 3 和结点 24 之间有一条无 向边,长度为 24;结点 15 和结点 25 之间有一条无向边,长度为 75。
请计算,结点 1 和结点 2021 之间的最短路径长度是多少。
提示:建议使用计算机编程解决问题。
运行限制最大运行时间:1s最大运行内存: 128M
代码:public class Main { public static void main(String[] args) { int n=2022; int[] dp=new int[n] ...
牌型种数(JAVA)
题目:小明被劫持到X 赌城,被迫与其他 3 人玩牌一副扑克牌 (去掉大小王牌,共 52 张),均发给 4个人,每个人 13 张.这时,小明脑子里突然冒出一个问题:如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自已手里能拿到的初始牌型组合一共有多少种呢?
请填写该整数,不要填写任何多余的内容或说明文字
代码:public class Main { static int result=0; //储存结果种数 public static void main(String[] args) { select(0,0); System.out.println(result); } public static void select(int x,int y){ //递归 if (x>13||y>13){ return; } if (x==13&&y== ...
数位排序(JAVA)
题目:小蓝对一个数的数位之和很感兴趣, 今天他要按照数位之和给数排序。当 两个数各个数位之和不同时, 将数位和较小的排在前面, 当数位之和相等时, 将数值小的排在前面。
例如, 2022 排在 409 前面, 因为 2022 的数位之和是 6, 小于 409 的数位 之和 13 。
又如, 6 排在 2022 前面, 因为它们的数位之和相同, 而 6 小于 2022 。
给定正整数n,m, 请问对 1 到 n 采用这种方法排序时, 排在第 m 个的元 素是多少?
输入格式输入第一行包含一个正整数 n 。
第二行包含一个正整数 m 。
输出格式输出一行包含一个整数, 表示答案。
样例输入
135
样例输出
3
样例说明1 到 13 的排序为: 1,10,2,11,3,12,4,13,5,6,7,8,9 。第 5 个数为 3 。
评测用例规模与约定对于30% 的评测用例,1≤m≤n≤300 。
对于50% 的评测用例, 1≤m≤n≤1000 。
对于所有评测用例, 1≤m≤n≤106 。
运行限制最大运行时间:3s最大运行内存: 512M
代码:import java.util.A ...
青蛙过河(JAVA)
题目:小青蛙住在一条河边, 它想到河对岸的学校去学习。小青蛙打算经过河里 的石头跳到对岸。
河里的石头排成了一条直线, 小青蛙每次跳跃必须落在一块石头或者岸上。 不过, 每块石头有一个高度, 每次小青蛙从一块石头起跳, 这块石头的高度就 会下降 1 , 当石头的高度下降到 0 时小青蛙不能再跳到这块石头上(某次跳跃 后使石头高度下降到 0 是允许的)。
小青蛙一共需要去学校上 x 天课, 所以它需要往返2x 次。当小青蛙具有 一个跳跃能力 y 时, 它能跳不超过 y 的距离。
请问小青蛙的跳跃能力至少是多少才能用这些石头上完 x 次课。
输入格式输入的第一行包含两个整数 n,x, 分别表示河的宽度和小青蛙需要去学校 的天数。请注意 2x 才是实际过河的次数。
第二行包含 n−1 个非负整数H1,H2,⋯,Hn−1, 其中Hi>0 表示在河中与 小青蛙的家相距 i 的地方有一块高度为 Hi 的石头, Hi=0 表示这个位置没有石 头。
输出格式输出一行, 包含一个整数, 表示小青蛙需要的最低跳跃能力。
样例输入
5 11 0 1 0
样例输出
4
样例说明由于只有两块高度为 ...