綠色計算大賽第二階段題解
第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]
範圍內的整數。
輸入:
34 35 33 25 44 45 46 17
輸出:
1 3 2 1 1 1 0 0
開始挑戰吧,祝你成功!
/*************************** * 函式功能: 根據一個時間段內的氣溫列表,來重新生成一個數組 * 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++) { result[i]=0; } for(int i=0;i<size;i++) { for(int j=i+1;j<size;j++){ if(temps[j]>temps[i]){ result[i]=j-i; break; } } } /********** END **********/ return result; }
第2關:摺紙小遊戲
樹袋熊是“綠盟”社群的一名綠色資源愛好者。他買了一個長方形彩紙,想要裁剪成儘可能大的相同大小的正方形彩紙送給女朋友,而且貫徹綠色精神,不能有剩餘。請你程式設計序來幫他追到女朋友吧!
題目描述:
長方形彩紙長m
,寬n
,求出裁剪的相同大小的正方形的邊長j
的最大值以及小正方形的個數k
。其中m,n,j,k
均為正整數。
輸入:
第一行為長方形的長m
第二行為長方形的寬n
輸出:
第一行輸出正方形邊長最大值j
第二行輸出正方形個數k
補充完善右側程式碼區中的Square
函式,實現根據輸入來判斷正方形邊長最大值和正方形個數的功能,具體要求如下:
- 不能有紙剩餘;
- 所有的正方形大小必須相同;
- 確保前兩個條件滿足的情況下,使正方形的邊長儘可能的大。
- 將結果存放在
j
,k
變數中。
輸入:
4
2
輸出:
2
2
樣例2
輸入:
7
3
輸出:
1
21
開始挑戰吧,祝你成功!
相當於求最大公約數
/***************************
* 函式功能: 計算裁剪的相同大小的正方形
* return: void
* @para m: 長方形的長
* @para n: 長方形的寬
* @para j: 存放輸出正方形邊長最大值
* @para k: 存放輸出正方形個數
***************************/
void Square(int m, int n, int &j, int &k)
{
/********** BEGIN **********/
int z,m1=m,n1=n;
if(m1<n1){
int temp=m1;
m1=n1;
n1=temp;
}
while(m1%n1!=0){
z=m1%n1;
m1=n1;
n1=z;
}
j=n1;
k=(m/j)*(n/j);
/********** END **********/
}
第3關:渡口與船
給定一個渡口(二維的),請計算渡口中停了多少艘船。 船用 +
表示,空位用字母o
表示。 你需要遵守以下規則:
- 給你一個有效的渡口(二維陣列),僅由船和空位組成。
- 船隻能水平或者垂直放置。換句話說,船隻能由
1
行,N
列組成,或者N
行,1
列組成,其中N
可以是任意大小。 - 兩艘船之間至少有一個水平或垂直的空位分隔,即沒有相鄰的船。
補充完善右側程式碼區中的countOfShips
函式,實現根據輸入的陣列來判斷船的數量。
輸入說明:
- 第一行表示渡口的長和寬(m, n);
- 接下輸入m行n列的資料表示渡口的停船情況;
輸出說明:
- 渡口中船數量;
輸入:
3 4
+ + + +
o o o o
o o o o
輸出:
1
輸入:
3 4
+ o o +
o o o +
o o o +
輸出:
2
無效樣例:
3 4
o o o +
+ + + +
o o o +
你不會收到這樣的無效樣例,因為船之間至少會有一個空位將它們分開。
開始挑戰吧,祝你成功!
/***************************
* 函式功能: 計算渡口中停了多少艘船
* return: 渡口中停的艘船個數
* @para ferry: 二維的渡口
* @para m: 渡口的行數
* @para n: 渡口的列數
***************************/
int countOfShips(char **ferry, int m, int n)
{
/********** BEGIN **********/
int num=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(ferry[i][j]=='+'){
for(int k=i+1;k<m;k++){
if(ferry[k][j]=='o')
break;
else
ferry[k][j]='o';
}
int k2;
for(k2=j+1;k2<n;k2++){
if(ferry[i][k2]=='o')
break;
}
num++;
j=k2-1;
}
}
}
return num;
/********** END **********/
}