1:年龄问题
s夫人一向很神秘。这会儿有人问起她的年龄,她想了想说:
“20年前,我丈夫的年龄刚好是我的2倍,而现在他的年龄刚好是我的1.5倍”。
你能算出s夫人现在的年龄吗?
这道题就是暴力就可以了
40
2 : 海盗与金币
12名海盗在一个小岛上发现了大量的金币,后统计一共有将近5万枚。
登上小岛是在夜里,天气又不好。由于各种原因,有的海盗偷拿了很多,有的拿了很少。
后来为了“均贫富”,头目提出一个很奇怪的方案:
每名海盗都把自己拿到的金币放在桌上。然后开始一个游戏。
金币最多的海盗要拿出自己的金币来补偿其他人。
补偿的额度为正好使被补偿人的金币数目翻番(即变为原来的2倍)。
游戏要一直进行下去,直到无法完成。
(当金币数最多的不只一个人或最多金币的人持有金币数不够补偿他人的)
游戏就这样紧张地进行了,一直进行了12轮,恰好每人都“放血”一次,
更离奇的是,刚好在第12轮后,每个人的金币数居然都相等了!! 这难道是天意吗?
请你计算,游戏开始前,所有海盗的初始金币数目,从小到大排列,中间有一个空格分开。
答案形如:
8 15 29 58 110 …
当然,这个不是正确答案。
public class haidaoyujinbi {
public static void main(String[] args) {
int[] b = new int[12];// 12名海盗
/**
* 有将近5万枚硬币可知范围 因为在第12轮后 每个人的金币数都相等了 所以12个人总的金币数 应该是12的倍数
*/
for (int i = 12; i < 50000; i += 12) {
for (int j = 0; j < 12; j++) {// 12轮后的结果
b[j] = i / 12;
}
dfs(b, 11, i);// 最后一个是最大的
}
}
/**
* b是这12个人手中的金币数 MaxIn是当前金币最多的那个人 sum为总的金币数
*/
public static void dfs(int[] b, int MaxIn, int sum) {
if (MaxIn < 0) {
for (int i = 11; i >= 0; i--) {
System.out.print(b[i] + " ");
}
// System.out.println("*"+sum);
return;
}
int count = 0;
for (int i = 0; i < 12; i++) {
if (i == MaxIn) {
continue;
} else {
if (b[i] % 2 != 0) {
return;
} else {
b[i] = b[i] / 2;
count += b[i];
}
}
}
b[MaxIn] = sum - count;
dfs(b, MaxIn - 1, sum);
}
}
//结果为 13 25 49 97 193 385 769 1537 3073 6145 12289 24577
(这道题可以以后没有了,蓝桥杯第十届已经是五道结果填空,五道编程大题了)
3 全排列
对于某个串,比如:“1234”,求它的所有全排列。
并且要求这些全排列一定要按照字母的升序排列。
对于“1234”,应该输出(一共4!=24行):
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321
下面是实现程序,请仔细分析程序逻辑,并填写划线部分缺少的代码。
// 轮换前k个,再递归处理
import java.util.*;
public class A
{
static void permu(char[] data, int cur){
if(cur==data.length-1){
System.out.println(new String(data));
return;
}
for(int i=cur; i<data.length; i++){
char tmp = data[i];
for(int j=i-1; j>=cur; j--) data[j+1] = data[j];
data[cur] = tmp;
permu(data, cur+1);
tmp = data[cur];
__________________________________________ ;//for(int j = cur; j < i; j++) data[j] = data[j + 1]; 填空
data[i] = tmp;
}
}
static void permu(String x){
permu(x.toCharArray(),0);
}
public static void main(String[] args){
permu("1234");
}
}
4 约瑟夫环
n 个人的编号是 1~n,如果他们依编号按顺时针排成一个圆圈,从编号是1的人开始顺时针报数。
(报数是从1报起)当报到 k 的时候,这个人就退出游戏圈。下一个人重新从1开始报数。
求最后剩下的人的编号。这就是著名的约瑟夫环问题。
本题目就是已知 n,k 的情况下,求最后剩下的人的编号。
题目的输入是一行,2个空格分开的整数n, k
要求输出一个整数,表示最后剩下的人的编号。
约定:0 < n,k < 1百万
例如输入:
10 3
程序应该输出:
4
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
import java.util.Scanner;
public class test1 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int k = in.nextInt();
System.out.println(cir(n,k));
}
public static int cir(int n,int m){
int p=0;
for(int i=2;i<=n;i++){
p=(p+m)%i;
}
return p+1;
}
}
其他的方法都会超时的,只能过部分样例
这里应该使用约瑟夫环公式:详见下面链接,讲的很详细
https://blog.csdn.net/weixin_42318538/article/details/89294690
测试数据:
100 3 91
2000 196 1963
10000 6847 4442
520000 84795 7725
820000 88795 458467
820000 99999 188212
721000 100001 142837
951000 200001 102843
999999 222222 177380
5交换次数
IT产业人才需求节节攀升。业内巨头百度、阿里巴巴、腾讯(简称BAT)在某海滩进行招聘活动。
招聘部门一字排开。由于是自由抢占席位,三大公司的席位随机交错在一起,形如:
ABABTATT,这使得应聘者十分别扭。
于是,管理部门要求招聘方进行必要的交换位置,使得每个集团的席位都挨在一起。即最后形如:
BBAAATTT 这样的形状,当然,也可能是:
AAABBTTT 等。
现在,假设每次只能交换2个席位,并且知道现在的席位分布,
你的任务是计算:要使每个集团的招聘席位都挨在一起需要至少进行多少次交换动作。
输入是一行n个字符(只含有字母B、A或T),表示现在的席位分布。
输出是一个整数,表示至少交换次数。
比如,输入:
TABTABBTTTT
程序应该输出:
3
再比如,输入:
TTAAABB
程序应该输出:
0
我们约定,输入字符串的长度n 不大于10万
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
这道题小白表示不会
6 自描述序列
小明在研究一个序列,叫Golomb自描述序列,不妨将其记作{G(n)}。这个序列有2个很有趣的性质:
- 对于任意正整数n,n在整个序列中恰好出现G(n)次。
- 这个序列是不下降的。
以下是{G(n)}的前几项:
n 12345678910111213
G(n)1223344455566
给定一个整数n,你能帮小明算出G(n)的值吗?
输入
一个整数n。
对于30%的数据,1 <= n <= 1000000
对于70%的数据,1 <= n <= 1000000000
对于100%的数据,1 <= n <= 2000000000000000
输出
一个整数G(n)
【样例输入】
13
【样例输出】
6
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
这道题小白表示不会
如果哪位大佬会的话能不能私信告诉我一下
如果需要往届真题测试数据加我QQ:1439775520