2、定时炸弹
1、题目
星系炸弹
在X星系的广袤空间中漂浮着许多X星人造“炸弹”,用来作为宇宙中的路标。
每个炸弹都可以设定多少天之后爆炸。
比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2015年1月16日爆炸。
有一个贝塔炸弹,2014年11月9日放置,定时为1000天,请你计算它爆炸的准确日期。
请填写该日期,格式为 yyyy-mm-dd 即4位年份2位月份2位日期。比如:2015-02-19
请严格按照格式书写。不能出现其它文字或符号。
2、思想
(1)calendar Api的使用,初始化使用Calendar.getInstance()方法
(2)设置某个时间使用cal.set(Calendar.YEAR,年份);方法
(3)向后加时间使用cal.add(Calendar.Date,天);
(4)输出:可以使用getTime得到直接方式的输出,有日期有星期
也可以使用toLocaleString() 得到中文输出
(5)关于日期方法总结:
https://blog.csdn.net/weixin_42673117/article/details/105024015
3、代码
package com.lanqiao.prepro;
import java.util.Calendar;
import java.util.Date;
public class a20052 {
public static void main(String[] args) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2014);
cal.set(Calendar.MONTH, 10);
cal.set(Calendar.DATE, 9);
cal.add(Calendar.DATE, 1000);
System.out.println(cal.getTime().toLocaleString());
}
}
3、组数字
1、题目
1~9的数字可以组成3个3位数,设为:A,B,C, 现在要求满足如下关系:
B = 2 * A
C = 3 * A
请你写出A的所有可能答案,数字间用空格分开,数字按升序排列。
注意:只提交A的值,严格按照格式要求输出。
2、思想
(1)注意每次判断完数组之后进行恢复
3、代码
package com.lanqiao.prepro;
import java.util.Arrays;
public class a20053 {
static int[] arr;
public static void main(String[] args) {
arr = new int[10];
Arrays.fill(arr, 0);
for(int a=100;a<1000;a++)
{
int b=2*a;
int c = 3*a;
if(b>100&&b<1000&&c>100&&c<1000)
{
if(check(a,b,c))
{
System.out.println(a+" "+b+" "+c);
}
}
Arrays.fill(arr, 0);
}
}
private static boolean check(int a, int b, int c) {
boolean flag = true;
while(a>0)
{
arr[a%10]=1;
a/=10;
}
while(b>0)
{
arr[b%10]=1;
b/=10;
}
while(c>0)
{
arr[c%10]=1;
c/=10;
}
for(int i=1;i<=9;i++)
{
if(arr[i]==0) flag=false;
}
return flag;
}
}
4.循环节长度
1、题目
两个整数做除法,有时会产生循环小数,其循环部分称为:循环节。
比如,11/13=6=>0.846153846153… 其循环节为[846153] 共有6位。
下面的方法,可以求出循环节的长度。
请仔细阅读代码,并填写划线部分缺少的代码。
2、思想
(1)填空题不能直接蒙,第一个还好,第二个还是要结合着题目来看
(2)根据试探,发现s1、s2已经上下两部分都填好了,重点就是s如何补充
(3)想着考点,这个地方很明显,考点就是substring的运用
(4)分析题目中形状的变化,得出每次只是截掉s后面三个字符
3、代码
package com.lanqiao.prepro;
public class a20055 {
public static void f(int n)
{
String s = "*";
for(int i=0; i<2*n-3; i++) s += ".";
s += "*";
String s1 = s + "\n";
String s2 = "";
for(int i=0; i<n-1; i++){
// System.out.println("=>"+s);
s = "." +s.substring(0,s.length()-3)+ "*"; //填空代码为中间一部分
s1 = s + "\n" + s1;
s2 += s + "\n";
}
System.out.println(s1+s2);
}
public static void main(String[] args)
{
f(8);
}
}
6、加法变乘法
我们都知道:1+2+3+ … + 49 = 1225
现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015
比如:
1+2+3+…+1011+12+…+2728+29+…+49 = 2015
就是符合要求的答案。
请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10)。
注意:需要你提交的是一个整数,不要填写任何多余的内容。
2、思想
注意:申请题,在做题!!!
一开始认为成了三部分之积,搞了好久才反应过来,只是中间两个数相乘!
3、代码
package com.lanqiao.prepro;
public class a20056 {
public static void main(String[] args) {
int sum1=0,sum2=0,sum3=0;
int x1=0,x2=0;
for(int i=1;i<50;i++)
{
sum1+=i;
x1=(i+1)*(i+2);
for(int j=i+3;j<50;j++)
{
sum2+=j;
x2=(j+1)*(j+2);
for(int k=j+3;k<50;k++)
{
sum3+=k;
}
if(sum1+sum2+sum3+x1+x2==2015)
{
System.out.println(i+" "+j+" ");
}
sum3=0;
}
sum2=0;
}
}
}
7、牌型种数
小明被劫持到X赌城,被迫与其他3人玩牌。
一副扑克牌(去掉大小王牌,共52张),均匀发给4个人,每个人13张。
这时,小明脑子里突然冒出一个问题:
如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?
请填写该整数,不要填写任何多余的内容或说明文字。
2、思想
(1)对dfs认知太刻板,只知道全排列的模板,不知道其他dfs
(2)dfs具体作用:适用于选择,组合多少个东西,有多少种方式等
(3)注意dfs中for循环,可以从0开始表示每一种选多少个,注意0个的存在
3、代码
package com.lanqiao.prepro;
public class a20058 {
static int[] arr;
static int ans;
public static void main(String[] args) {
ans=0;
f(0,0);
System.out.println(ans);
}
private static void f(int k, int cur) {
if(k>13||cur>13)
{
return;
}
if(cur==13)
{
ans++;
return;
}
for(int i=0;i<5;i++)//注意0张牌,也是一种情况!!
{
f(k+1,cur+i);
}
}
}
9、垒骰子
1、题目
赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体。
经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥!
我们先来规范一下骰子:1 的对面是 4,2 的对面是 5,3 的对面是 6。
假设有 m 组互斥现象,每组中的那两个数字的面紧贴在一起,骰子就不能稳定的垒起来。 atm想计算一下有多少种不同的可能的垒骰子方式。
两种垒骰子方式相同,当且仅当这两种方式中对应高度的骰子的对应数字的朝向都相同。
由于方案数可能过多,请输出模 10^9 + 7 的结果。
不要小看了 atm 的骰子数量哦~
「输入格式」
第一行两个整数 n m
n表示骰子数目
接下来 m 行,每行两个整数 a b ,表示 a 和 b 不能紧贴在一起。
「输出格式」
一行一个数,表示答案模 10^9 + 7 的结果。
「样例输入」
2 1
1 2
「样例输出」
544
「数据范围」
对于 30% 的数据:n <= 5
对于 60% 的数据:n <= 100
对于 100% 的数据:0 < n <= 10^9, m <= 36
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 2000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
2、思想
(1)第九题先想递归的想法
(2)从最上面的骰子开始,有6中选择(以冲上面的点数为代表)
(3)然后最上面一个看成一部分,下面的所有看成一部分
(4)根据下面是否符合条件进行判定
3、代码
package com.lanqiao.prepro;
import java.util.Arrays;
import java.util.Scanner;
public class a20059 {
static int ans=0;
static int sum=1;
static int m,n;
static int[][] arr;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
arr = new int[7][7];
for(int i=0;i<7;i++)
for(int j=0;j<7;j++)
arr[i][j]=0;
for(int i=0;i<m;i++)
{
int a=sc.nextInt();
int b=sc.nextInt();
arr[a][b]=1;
arr[b][a]=1;
}
// Utils.print(arr);
f(n,1);
System.out.println(ans);
}
private static void f(int k,int m) {
if(k==0)
{
if(sum>1)
ans+=sum;
ans%=Math.pow(10, 9)+7;
sum=1;
return;
}
for(int i=1;i<=6;i++)
{
// System.out.println(ans);
if(arr[i][(m+3)%7]==0&&k!=n) sum*=16;
else if(arr[i][(m+3)%7]==1) {
continue;
}
f(k-1,i);
}
}
}