1. 程式人生 > >全國高校綠色計算大賽模擬賽第二階段題解

全國高校綠色計算大賽模擬賽第二階段題解

第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;
	 
	 }
}