全国高校绿色计算大赛模拟赛第二阶段题解

第1关:气温预测

挑战任务

根据每日气温数组,请重新生成一个数组,新数组对应位置的是你需要再等待多久温度才会升高的天数。如果之后都不会升高,请用0来代替。

例如:给定一个数组 temps = {34,35,33,25,44,19,18,17} 新生成的数组应该为[1, 3, 2, 1, 0, 0, 0, 0]

temps数组第一天温度是34℃,第二天是35℃,所以对应新生成数组位置的数据应该是1,代表还需等待1天就会升温,第二天温度是35℃,还需等待3天才会出现比35℃还高的温度(44℃),第五天温度是44℃,之后都不会升温了,则用0来代替。

编程要求

补充完善右侧代码区中的dailyTemps(Integer[] temps)函数,实现,最后返回计算的结果即可。

注意:气温 列表长度的范围是 [1, 10000]。每个气温的值的都是 [0, 100]范围内的整数。

测试说明

样例1

输入:

34 35 33 25 44 45 46 17

输出:

[1, 3, 2, 1, 1, 1, 0, 0]


开始挑战吧,祝你成功!

AcCode:

package step1;

public class Task {
	public  int[] dailyTemps(Integer[] temperatures){
		/********** BEGIN **********/
		int [] days = new int[temperatures.length];
		int top = 0;
		for (int i = 0; i < temperatures.length; i++) {
			int k = 0;
			boolean isFind = false;
			for (int j = i+1; j < temperatures.length; j++) {
				k++;
				if(temperatures[j]>temperatures[i]) {
					isFind = true;
					break;
				}	
			}
			if(isFind) {
				days[top++] = k;	
			}else {
				days[top++] = 0;
			}
		}
		return days;
		/********** END **********/
	}
}

第2关:折纸小游戏

挑战任务

树袋熊是“绿盟”社区的一名绿色资源爱好者。他买了一个长方形彩纸,想要裁剪成尽可能大的相同大小的正方形彩纸送给女朋友,而且贯彻绿色精神,不能有剩余。请你编程序来帮他追到女朋友吧!

题目描述:

长方形彩纸长m,宽n,求出裁剪的相同大小的正方形的边长j的最大值以及小正方形的个数k。其中m,n,j,k均为正整数。

输入:

第一行为长方形的长m
第二行为长方形的宽n

输出:

第一行输出正方形边长最大值j
第二行输出正方形个数k

编程要求

补充完善右侧代码区中的main函数,实现根据输入来判断正方形边长最大值和正方形个数的功能,具体要求如下:

  • 不能有纸剩余;
  • 所有的正方形大小必须相同;
  • 确保前两个条件满足的情况下,使正方形的边长尽可能的大;
  • 输出正方形的边长的最大值和正方形的个数。

测试说明

样例1

输入:

4
2

输出:

2
2

样例2

输入:

7
3

输出:

1
21


开始挑战吧,祝你成功!

AcCode:

package step2;

import java.util.Scanner;

public class Task {
    public static int getGys(int a,int b) {
		int mod = a%b;
		while(mod!=0) {
			a = b;
			b = mod;
			mod = a%b;
		}
		return b;
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int length = sc.nextInt();	//长
		int width = sc.nextInt();	//宽
		/********** BEGIN **********/
		int maxLength = getGys(length, width);
		System.out.println(maxLength);
		System.out.println((length*width)/(maxLength*maxLength));
		/********** END **********/
	}
}

第3关:渡口与船

挑战任务

给定一个渡口(二维的),请计算渡口中停了多少艘船。 船用 + 表示,空位用字母o表示。 你需要遵守以下规则:

  • 给你一个有效的渡口(二维数组),仅由船和空位组成。
  • 船只能水平或者垂直放置。换句话说,船只能由 1 行, N 列组成,或者 N行, 1 列组成,其中N可以是任意大小。
  • 两艘船之间至少有一个水平或垂直的空位分隔,即没有相邻的船。

编程要求

补充完善右侧代码区中的countOfShips(char[][] ferry)函数,实现根据输入的数组来判断船的数量,将船的数量作为返回值返回。

测试说明

样例1

输入:
3 4
+ + + +
o o o o
o o o o

输出:

1

样例2

输入:
3 4
+ o o +
o o o +
o o o +

输出:

2

注意:右侧测试集中有输入参数传入,如:3 4 ,这两个数字是后台构建渡口时传入的大小,不会作为函数countOfShips的参数传入,可以忽略这两个数字的作用。

无效样例:

o o o +
+ + + +
o o o +

你不会收到这样的无效样例,因为船之间至少会有一个空位将它们分开。


开始挑战吧,祝你成功!

AcCode:

package step3;

public class Task {

	 public int countOfShips(char[][] ferry) {
	  
		  /**************BEGIN************/
		 int boatSum = 0;
		 for (int i = 0; i < ferry.length; i++) {
			for (int j = 0; j < ferry[i].length; j++) {
				if(ferry[i][j]=='+') {
					for (int j2 = i+1; j2 < ferry.length; j2++) {//竖着搜
						if(ferry[j2][j]=='o') {
							break;
						}else {
							ferry[j2][j]='o';
						}
					}
					
					int j2;
					for (j2 = j+1; j2 < ferry[i].length; j2++) {//横着搜
						if(ferry[i][j2]=='o') {
							break;
						}
					}
					boatSum++;
					j = j2-1;
				}
			}	 
		}
	      /***********END ***************/
		return boatSum;
	 
	 }
}

 

你可能感兴趣的:(全国高校绿色计算大赛)