超级码力在线编程大赛20200829
附上hexo博客地址:blog.little-star.top
菜鸡去参赛只答出了两道题,而且是最简单的两道,没进前300,分享一下我的答案。
大三第一天,周六,天气晴,一天待图书馆,图书馆没什么人,挺安静的。
晚上回宿舍,写篇东西记录一下。
树木规划
题目我就直接截图了。
解答
类似贪心的思想,第一棵树肯定要,第一个棵树的坐标加上美观间隔d就是第二棵树的最近坐标,中间的树都需要删除。
这么简单我还要做差不多半小时。
public static int treePlanning(int[] trees, int d) {
// write your code here.
if(trees.length == 0 || trees.length == 1 ) return 0;
int latest = trees[0] + d; //下一棵树的最近坐标
int count = 0;
for(int i = 1 ; i<trees.length ; i++){
if(trees[i] >= latest){
latest = trees[i]+d;
}else{
count++;
}
}
return count;
}
正三角形拼接
题目我直接截图。
解答
这道题耗了我比较多的时间,主要是我一开始忽略了前提条件最少有三根木棍,不认真审题的后果。
在草稿纸上列出各种情况就清晰多了,至少有三根木棍最多也就切2次(我一开始想如果只有一根木棍需要考虑切3次的情况耗了一点时间)。
切0次:有3根相同长度的木棍。
切1次:有两根相同长度的木棍且有一根比它们长的木棍;有一根木棍的长度是另一根木棍的两倍。
切两次:其余情况。
我的解答比较小白,用了多次循环嵌套,一定会有更加优化的做法。
public int makeEquilateralTriangle(int[] lengths) {
// write your code here.
//返回0的情况
for(int i = 0 ; i<lengths.length-2 ; i++){
int count = 1;
for(int j = i+1; j<lengths.length ; j++){
if(lengths[i] != lengths[j])continue;
count++;
if(count == 3) return 0;
}
}
//返回1的情况
for(int i = 0 ; i<lengths.length ; i++){
for(int j=0 ; j<lengths.length; j++){
if(lengths[i] == lengths[j]*2 ) return 1;
}
}
int twoSameMin = Integer.MAX_VALUE;
for(int i = 0 ; i<lengths.length-1 ; i++){
for(int j=i+1 ; j<lengths.length ; j++){
if(lengths[i] == lengths[j]){
if(lengths[i]<twoSameMin) twoSameMin = lengths[i];
}
}
}
if(twoSameMin != Integer.MAX_VALUE){
for(int i = 0 ; i<lengths.length ; i++){
if(lengths[i] > twoSameMin) return 1;
}
}
//其余情况返回2
return 2;
}
下面两题我也有做,但在规定时间没有提交通过,现在也不能检测我做得对不对,所以先不放出我的解答。
把题目放出来先。
大楼间穿梭
这个蜘蛛侠是真滴皮。
对称前后缀
这道题我AC了挺多遍的,测试几个样例能过,但提交没过。