[C_CH13-中] 坑洞路面
問題描述 :
有一個路段因為砂石車經常行駛導致路面坑坑洞洞,由於路面坑洞的關係,下雨天之後就顯得越來越容易積水了,某天雨後,大華想到路面上觀察坑洞裡的積水,並算出積水量。輸入為路面的高低起伏值,輸出為積水量。例如右圖,灰色地方為路面的高低起伏,高度分別為3 2 1 4 2 3 5,藍色部分為積水的區域。
輸入說明 :
第一列輸入為一個正整數N,代表計算的路面寬度有N個單位。
第二列輸入為N個正整數,代表路面的高低起伏。
輸出說明 :
輸出為一個正整數,代表積水的區域有多少。
範例 :
有一個路段因為砂石車經常行駛導致路面坑坑洞洞,由於路面坑洞的關係,下雨天之後就顯得越來越容易積水了,某天雨後,大華想到路面上觀察坑洞裡的積水,並算出積水量。輸入為路面的高低起伏值,輸出為積水量。例如右圖,灰色地方為路面的高低起伏,高度分別為3 2 1 4 2 3 5,藍色部分為積水的區域。
輸入說明 :
第一列輸入為一個正整數N,代表計算的路面寬度有N個單位。
第二列輸入為N個正整數,代表路面的高低起伏。
輸出說明 :
輸出為一個正整數,代表積水的區域有多少。
範例 :
Sample Input: | Sample Output: |
7 3 2 1 4 2 3 5 | 6 |
說明:
N = 7
3 2 1 4 2 3 5
1.將路面初始化
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
2.將路面高度設為1
0
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
0
|
0
|
1
|
0
|
0
|
1
|
1
|
0
|
0
|
1
|
0
|
1
|
1
|
1
|
1
|
0
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
3.接著用陣列一列一列的尋找,計算兩個1之間0的數量,就是會積水的地方
第一列
0
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
0
|
0
|
1
|
0
|
0
|
1
|
1
|
0
|
0
|
1
|
0
|
1
|
1
|
1
|
1
|
0
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
第二列
計算兩個1(粗體字)之間,0的數量
首先要記住第一個1的位置(位置是3),接著找第二個1(位置是6)
第二個位置 - 第一個位置 - 1 = 0的數量(2)
0
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
0
|
0
|
1
|
0
|
0
|
1
|
1
|
0
|
0
|
1
|
0
|
1
|
1
|
1
|
1
|
0
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
第三列
首先要記住第一個1的位置(位置是0),接著找第二個1(位置是3)
第二個位置 - 第一個位置 - 1 = 0的數量(2)
接著把第二個1的位置當成新的第一個1的位置(位置是3)
找新的第二個1(位置是5)
新第二個位置 - 新第一個位置 - 1 = 0的數量(1)
0
|
0
|
0
|
0
|
0
|
0
|
1
|
0
|
0
|
0
|
1
|
0
|
0
|
1
|
1
|
0
|
0
|
1
|
0
|
1
|
1
|
1
|
1
|
0
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
以此類推,在過程中把計算到0的數量加起來,就是水坑的數量了。
- #include <iostream>
- using namespace std;
- int main() {
- // [C_CH13-中] 坑洞路面
- int N;
- cin >> N;
- int num[N];
- int max = -1;
- //使用者輸入並找出最高的路
- for(int i = 0;i < N;i++)
- {
- cin >> num[i];
- if(num[i] > max)
- {
- max = num[i];
- }
- }
- //用二維陣列建立路面圖,初始化
- int road[max][N];
- for(int i = 0;i < max;i++)
- {
- for(int j = 0;j < N;j++)
- {
- road[i][j] = 0;
- }
- }
- int c = 0;
- //用二維陣列建立路面圖
- for(int i = 0;i < max;i++)
- {
- for(int j = 0;j < N;j++)
- {
- if(i+num[j] >= max)
- {
- road[i][j] = 1;
- }
- }
- }
- //計算凹洞數
- int fpos;
- int result = 0;
- bool fir = false;//沒有第一個1
- for(int i = 0;i < max;i++)
- {
- for(int j = 0;j < N;j++)
- {
- if(road[i][j] == 1)
- {
- if(fir == false)
- {
- fpos = j;
- fir = true;
- }
- else
- {
- result = result + (j-fpos-1);
- fpos = j;
- }
- }
- }
- fir = false;
- }
- cout << result << endl;
- return 0;
- }
沒有留言:
張貼留言