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

函式,實現,最後返回計算的結果即可。

注意:氣溫 列表長度的範圍是 [1, 10000]。每個氣溫的值的都是 [0, 100]範圍內的整數。

測試說明

樣例1

輸入

34 35 33 25 44 45 46 17

輸出

1 3 2 1 1 1 0 0

開始挑戰吧,祝你成功!

程式碼如下:

#include <iostream>

using namespace std;

/***************************
* 函式功能: 根據一個時間段內的氣溫列表,來重新生成一個數組
* return: 計算結果
* @para array: 一段時間內的氣溫列表
* @para size: 陣列array的大小
***************************/
int* dailyTemps(int temps[], int size)
{
	int *result = new int[size];
	/********** BEGIN **********/
	for (int i = 0; i<size; i++) {
		int j = i + 1;
		while (j<size && temps[i] >= temps[j]) j++;
		result[i] = j<size ? j - i : 0;
	}

	/********** END **********/
	return result;
}

第2關:摺紙小遊戲

挑戰任務

樹袋熊是“綠盟”社群的一名綠色資源愛好者。他買了一個長方形彩紙,想要裁剪成儘可能大的相同大小的正方形彩紙送給女朋友,而且貫徹綠色精神,不能有剩餘。請你程式設計序來幫他追到女朋友吧!

題目描述:

長方形彩紙長m,寬n,求出裁剪的相同大小的正方形的邊長j的最大值以及小正方形的個數k。其中m,n,j,k均為正整數。

輸入

第一行為長方形的長m
第二行為長方形的寬n

輸出

第一行輸出正方形邊長最大值j
第二行輸出正方形個數k

程式設計要求

補充完善右側程式碼區中的Square函式,實現根據輸入來判斷正方形邊長最大值和正方形個數的功能,具體要求如下:

  • 不能有紙剩餘;
  • 所有的正方形大小必須相同;
  • 確保前兩個條件滿足的情況下,使正方形的邊長儘可能的大。
  • 將結果存放在jk變數中。

測試說明

樣例1

輸入

4
2

輸出

2
2

樣例2

輸入

7
3

輸出

1
21

開始挑戰吧,祝你成功!

解題思路:題目說了一大堆,其實就是求出長寬的最大公約數,最大公約數就是最大正方形的邊長,那麼正方形個數也就出來了。。。

程式碼如下:

#include <iostream>

using namespace std;

/***************************
* 函式功能: 計算裁剪的相同大小的正方形
* return: void
* @para m: 長方形的長
* @para n: 長方形的寬
* @para j: 存放輸出正方形邊長最大值
* @para k: 存放輸出正方形個數
***************************/
void Square(int m, int n, int &j, int &k)
{
	/********** BEGIN **********/
	int x = m, y = n;
	while (m) {
		int t = n % m;
		n = m;
		m = t;
	}
	j = n;
	k = x * y / j / j;

	/********** END **********/
}

第3關:渡口與船

挑戰任務

給定一個渡口(二維的),請計算渡口中停了多少艘船。 船用 + 表示,空位用字母o表示。 你需要遵守以下規則:

  • 給你一個有效的渡口(二維陣列),僅由船和空位組成。
  • 船隻能水平或者垂直放置。換句話說,船隻能由 1 行, N 列組成,或者 N 行, 1 列組成,其中N可以是任意大小。
  • 兩艘船之間至少有一個水平或垂直的空位分隔,即沒有相鄰的船。

程式設計要求

補充完善右側程式碼區中的countOfShips函式,實現根據輸入的陣列來判斷船的數量。

測試說明

輸入說明:

  • 第一行表示渡口的長和寬(m, n);
  • 接下輸入m行n列的資料表示渡口的停船情況;

輸出說明:

  • 渡口中船數量;

樣例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
o o o +
+ + + +
o o o +

你不會收到這樣的無效樣例,因為船之間至少會有一個空位將它們分開。

開始挑戰吧,祝你成功!

解題思路:直接暴力找,如果當先為‘+’那麼分別從右和下兩個方向找,每遇到一個‘+’,就將之程式設計‘o’,當遇見‘o’時,計數+1

程式碼如下:

#include <iostream>

using namespace std;

/***************************
* 函式功能: 計算渡口中停了多少艘船
* return: 渡口中停的艘船個數
* @para ferry: 二維的渡口
* @para m: 渡口的行數
* @para n: 渡口的列數
***************************/
int countOfShips(char **ferry, int m, int n)
{
	/********** BEGIN **********/
	int ans = 0;
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if (ferry[i][j] != '+') continue;
			if (j + 1 < n && ferry[i][j + 1] == '+')
				while (j < n && ferry[i][j] == '+') ferry[i][j++] = 'o';
			if (i + 1 < m && ferry[i + 1][j] == '+') {
				int t = i;
				while (t < m && ferry[t][j] == '+') ferry[t++][j] = 'o';
			}
			ans++;
		}
	}
	return ans;

	/********** END **********/
}