因为毕业也没有兴致整这些东西,就没有参加了,突然想起这几天比赛结束了,就找题做做,绝没有看答案,代码仅测试,很多可以优化的地方,练练思路:)
A.九进制2022->十进制
2022
2*9^3+0*9^2+2*9^1+2*9^0
=1,478
按八进制按权的方法展开
B.顺子日期
月日4位其中3个是顺子
012x x=0-9种 10种
x012 x=1,1种
123x x=0,1种
x123 x=0 1,2种
234x 排除
x234 排除
345x 排除
x345 排除
456x 排除
x456 排除
567x 排除
x567 排除
678x 排除
x678 排除
789x 排除
x789 排除
14种
C.刷题统计
小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做α道题目,周六和周日每天做b道题目。请你帮小明计算,按照计划他将在第几天实现做题数大于等于n题?
【输入格式】
输入一行包含三个整数a, b 和n.
【输出格式】
输出一个整数代表天数。
个人想法:
情况1.一周内完成
利用循环
情况2.超过一周
先剪掉多余的周的数据,再利用情况一处理
int a=2,b=3,n=22;
int sumDay=0;
if(n>=5*a+2*b){
sumDay=n/(5*a+2*b)*7;
n%=(5*a+2*b);
}
for (int i = 1; i < 8; i++) {
if(n<=0)break;
if(i>=6)
n-=a;
else
n-=b;
sumDay+=1;
}
System.out.println(sumDay);
测试代码,比赛应该用Long,或许有BUG,思想方向应该是对的,可以得几分:)
D.修剪灌木
爱丽丝要完成一项修剪灌木的工作。
有N棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晚会修剪一棵灌木,让灌木的高度变为0厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始,每天向右修剪一棵灌木。当修剪了最右侧的灌木后,她会调转方向,下一天开始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。然后如此循环往复。
灌木每天从早上到傍晚会长高1厘米,而其余时间不会长高。在第一天的早晨,所有灌木的高度都是О厘米。爱丽丝想知道每棵灌木最高长到多高。
解决思路:经过手动测试2 3棵,会形成循环,取最大值作为循环结束条件(毕竟每一轮都在+1和=0所以肯定有一个最大值),循环内,来回+1,置0,取最大值存储
long time = System.currentTimeMillis();
int n=7;
int[] sum=new int[n];
int[] max=new int[n];
int start=0;
int type=1;
if(n==1)
{
System.out.println(1);
return;
}
while(max[0]==0 || max[0]!=sum[0]){
if(start<0){
type=1;
start=0;
}
if(start==n){
type=-1;
start=n-1;
}
for (int j = 0; j < n; j++) {
if(max[j]<sum[j])max[j]=sum[j];
sum[j]+=1;
}
sum[start]=0;
for (int i : sum) {
System.out.print(i+" ");
}
System.out.println();
start+=type;
}
System.out.println("*********");
for (int i : max) {
System.out.print(i+" ");
}
System.out.println("\n*********");
System.out.println(System.currentTimeMillis()-time+"ms");
经过运行,10000棵也能1s内完成,当测试会发现
n=1到7得出以下结果
1
22
4 2 4
6 4 4 6
8 6 4 6 8
10 8 6 6 8 10
12 10 8 6 8 10 12
可以用一个小的循环,很简单的计算出来,就不敲这个方法的了,这题满分应该不是问题:)
E: X 进制减法
进制规定了数字在数位上逢几进一。
X进制是一种很神奇的进制,因为其每一数位的进制并不固定!例如说某种X进制数,最低数位为二进制,第二数位为十进制,第三数位为八进制,则X进制数321转换为十进制数为65。
现在有两个X进制表示的整数A和B,但是其具体每一数位的进制还不确定,只知道A和B是同一进制规则,且每一数位最高为N进制,最低为二进制。请你算出A一B的结果最小可能是多少。
请注意,你需要保证A 和B在X进制下都是合法的,即每一数位上的数字要小于其进制。
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int M = scanner.nextInt();
int K = scanner.nextInt();
int[][] Map =new int[N][M];
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
Map[i][j] = scanner.nextInt();
}
}
int Num=0;
/************************/
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
for (int r = i; r < N; r++) {
for (int c = j; c < M; c++) {
int Sum=0;
out:for (int startr = i; startr <= r; startr++) {
for (int startc = j; startc <= c; startc++) {
Sum+=Map[startr][startc] ;
if(Sum>K){
break out;
}
}
}
if(Sum<=K){
Num++;
}
}
}
}
}
System.out.println(Num);
直接爆破遍历,应该有些样本会超时,应该可以得一半的分:)
剩下的题只会爆破了,可能会得10来分吧
╮(╯▽╰)╭
做到这个程度,不知道省二有木有