[Coursera 計算導論與C語言基礎] 第十週作業(下)
阿新 • • 發佈:2019-01-01
程式設計題#5:異常細胞檢測
來源: POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)
注意: 總時間限制: 1000ms 記憶體限制: 65536kB
描述
我們拍攝的一張CT照片用一個二維陣列來儲存,假設陣列中的每個點代表一個細胞。每個細胞的顏色用0到255之間(包括0和255)的一個整數表示。我們定義一個細胞是異常細胞,如果這個細胞的顏色值比它上下左右4個細胞的顏色值都小50以上(包括50)。陣列邊緣上的細胞我們不檢測。現在我們的任務是,給定一個儲存CT照片的二維陣列,寫程式統計照片中異常細胞的數目。
輸入
第一行包含一個整數N(100>=N>2).
下面有 N 行,每行有 N 個0~255之間的整數,整數之間用空格隔開。
輸出
輸出只有一行,包含一個整數,為異常細胞的數目。
程式設計題#6:迴圈移動
來源: POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)
注意: 總時間限制: 1000ms 記憶體限制: 65536kB
描述
給定一組整數,要求利用陣列把這組數儲存起來,再利用實現對陣列中的數迴圈移動。假定共有n個整數,則要使前面各數順序向後移m個位置,並使最後m各數變為最前面的m各數。
注意,不要用先輸出後m個數,再輸出前n-m個數的方法實現,也不要用兩個陣列的方式實現。
要求只用一個數組的方式實現,一定要保證在輸出結果時,輸出的順序和陣列中數的順序是一致的。
輸入
輸入有兩行:第一行包含一個正整數n和一個正整數m,第二行包含n個正整數。每兩個正整數中間用一個空格分開。
輸出
程式設計題#7:中位數
來源: POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)
注意: 總時間限制: 2000ms 記憶體限制: 65536kB
描述
中位數定義:一組資料按從小到大的順序依次排列,處在中間位置的一個數或最中間兩個資料的平均值(如果這組數的個數為奇數,則中位數為位於中間位置的那個數;如果這組數的個數為偶數,則中位數是位於中間位置的兩個數的平均值).
給出一組無序整數,求出中位數,如果求最中間兩個數的平均數,向下取整即可(不需要使用浮點數)
輸入
該程式包含多組測試資料,每一組測試資料的第一行為N,代表該組測試資料包含的資料個數,1 <= N <= 15000.
接著N行為N個數據的輸入,N=0時結束輸入
輸出
輸出中位數,每一組測試資料輸出一行
來源: POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)
注意: 總時間限制: 1000ms 記憶體限制: 65536kB
描述
某校大門外長度為L的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1米。我們可以把馬路看成一個數軸,馬路的一端在數軸0的位置,另一端在L的位置;數軸上的每個整數點,即0,1,2,……,L,都種有一棵樹。
馬路上有一些區域要用來建地鐵,這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止點的座標都是整數,區域之間可能有重合的部分。現在要把這些區域中的樹(包括區域端點處的兩棵樹)移走。你的任務是計算將這些樹都移走後,馬路上還有多少棵樹。
輸入
輸入的第一行有兩個整數L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表馬路的長度,M代表區域的數目,L和M之間用一個空格隔開。接下來的M行每行包含兩個不同的整數,用一個空格隔開,表示一個區域的起始點和終止點的座標。
輸出
來源: POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)
注意: 總時間限制: 1000ms 記憶體限制: 65536kB
描述
我們拍攝的一張CT照片用一個二維陣列來儲存,假設陣列中的每個點代表一個細胞。每個細胞的顏色用0到255之間(包括0和255)的一個整數表示。我們定義一個細胞是異常細胞,如果這個細胞的顏色值比它上下左右4個細胞的顏色值都小50以上(包括50)。陣列邊緣上的細胞我們不檢測。現在我們的任務是,給定一個儲存CT照片的二維陣列,寫程式統計照片中異常細胞的數目。
輸入
第一行包含一個整數N(100>=N>2).
下面有 N 行,每行有 N 個0~255之間的整數,整數之間用空格隔開。
輸出
輸出只有一行,包含一個整數,為異常細胞的數目。
//程式設計題#5:異常細胞檢測 #include <iostream> using namespace std; int main() { int n = 0; cin >> n; int count = 0; //記錄異常細胞個數 int matrix[100][100] = {0}; for (int i = 0; i < n; i++) //將數值記錄進二維陣列 for (int j = 0; j < n; j++) { cin >> matrix[i][j]; } for (int i = 1; i < n - 1; i++) //遍歷陣列,與上下左右比較 for (int j = 1;j<n-1;j++) { if ((matrix[i - 1][j] - matrix[i][j]) >= 50 && (matrix[i + 1][j] - matrix[i][j]) >= 50 && (matrix[i][j - 1] - matrix[i][j]) >= 50 && (matrix[i][j + 1] - matrix[i][j]) >= 50) { count++; } } cout << count<< endl; return 0; }
程式設計題#6:迴圈移動
來源: POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)
注意: 總時間限制: 1000ms 記憶體限制: 65536kB
描述
給定一組整數,要求利用陣列把這組數儲存起來,再利用實現對陣列中的數迴圈移動。假定共有n個整數,則要使前面各數順序向後移m個位置,並使最後m各數變為最前面的m各數。
注意,不要用先輸出後m個數,再輸出前n-m個數的方法實現,也不要用兩個陣列的方式實現。
要求只用一個數組的方式實現,一定要保證在輸出結果時,輸出的順序和陣列中數的順序是一致的。
輸入
輸入有兩行:第一行包含一個正整數n和一個正整數m,第二行包含n個正整數。每兩個正整數中間用一個空格分開。
輸出
輸出有一行:經過迴圈移動後陣列中整數的順序依次輸出,每兩個整數之間用空格分隔。
這題自己沒想出來,要回頭看。參考答案兩種:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n = 0, m = 0;
cin >> n >> m;
vector<int> samle(n);
for (int i = 0; i < n; i++)
{
cin >> samle[i];
}
for (int i = 0; i < m; i++)
{
int temp = samle[n-1];
for (int j = 0; j < n-1; j++)
{
samle[n-1-j] = samle[n-j-2];
}
samle[0] = temp;
}
for (int i = 0; i < n; i++)
{
if (i != n-1)
{
cout << samle[i] << " ";
}
else
{
cout << samle[i] << endl;
}
}
return 0;
}
#include<iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
int number[500];
for (int i = 0; i < n; i++) {
cin >> number[i];
}
for (int i = 0; i < m; i++) {
int temp = number[0];
int temp1 = number[1];
int temp2 = number[n - 1];
for (int j = 1; j < n; ) {
temp1 = number[j];
number[j] = temp;
temp = temp1;
j++;
}
number[0] = temp2;
}
for (int i = 0; i < n; i++) {
if (i != n - 1)
cout << number[i] << ' ';
else
cout << number[i] << endl;
}
return 0;
}
程式設計題#7:中位數
來源: POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)
注意: 總時間限制: 2000ms 記憶體限制: 65536kB
描述
中位數定義:一組資料按從小到大的順序依次排列,處在中間位置的一個數或最中間兩個資料的平均值(如果這組數的個數為奇數,則中位數為位於中間位置的那個數;如果這組數的個數為偶數,則中位數是位於中間位置的兩個數的平均值).
給出一組無序整數,求出中位數,如果求最中間兩個數的平均數,向下取整即可(不需要使用浮點數)
輸入
該程式包含多組測試資料,每一組測試資料的第一行為N,代表該組測試資料包含的資料個數,1 <= N <= 15000.
接著N行為N個數據的輸入,N=0時結束輸入
輸出
輸出中位數,每一組測試資料輸出一行
//程式設計題#7:中位數
//先排序再求中位數
#include <iostream>
using namespace std;
int main()
{
int n = 0;
int a[15000] = { 0 };
int middle = 0;
while (1)
{
cin >> n;
if (n == 0) break; // n為0時,跳出while迴圈。
//用陣列a記錄數值
for (int i = 0; i < n ;i++)
{
cin >> a[i];
}
//給陣列排序,由小到大.
for (int i = 0; i < n-1; i++)
for (int j = i + 1; j < n;j++)
{
if (a[i] > a[j])
{
int change = a[i];
a[i] = a[j];
a[j] = change;
}
}
if (n % 2 != 0) //n是奇數
{
middle = a[(n + 1) / 2-1]; //中位數則為中間的數
}
else //n是偶數
{
middle = (a[n / 2 - 1] + a[n / 2])/2; //中位數則為中間兩數的均值
}
cout << middle << endl;
}
return 0;
}
程式設計題#8:校門外的樹來源: POJ (Coursera宣告:在POJ上完成的習題將不會計入Coursera的最後成績。)
注意: 總時間限制: 1000ms 記憶體限制: 65536kB
描述
某校大門外長度為L的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是1米。我們可以把馬路看成一個數軸,馬路的一端在數軸0的位置,另一端在L的位置;數軸上的每個整數點,即0,1,2,……,L,都種有一棵樹。
馬路上有一些區域要用來建地鐵,這些區域用它們在數軸上的起始點和終止點表示。已知任一區域的起始點和終止點的座標都是整數,區域之間可能有重合的部分。現在要把這些區域中的樹(包括區域端點處的兩棵樹)移走。你的任務是計算將這些樹都移走後,馬路上還有多少棵樹。
輸入
輸入的第一行有兩個整數L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表馬路的長度,M代表區域的數目,L和M之間用一個空格隔開。接下來的M行每行包含兩個不同的整數,用一個空格隔開,表示一個區域的起始點和終止點的座標。
輸出
輸出包括一行,這一行只包含一個整數,表示馬路上剩餘的樹的數目。
我的答案,結果對,但系統不接受:
//程式設計題#8:校門外的樹
#include <iostream>
using namespace std;
//用陣列來表示,1表示有樹,0表示移除。
int main()
{
int orginal[10001] = { 0 };//陣列orginal用來儲存原本有樹的區域
int move[100][2] = { 0 };//二維陣列move用來儲存需區域的個數及其始末位置
int l, m;
l = m = 0;
cin >> l >> m;
int count = 0;
for (int i = 0; i < l+1; i++) //如果l長度為3,那應該有4個結點,即應該有l+1個結點。
{
orginal[i] = 1; //將原本有樹的位置置為1
}
for (int i = 0; i < m; i++) //將資料寫進二維陣列move
{
cin >> move[i][0] >> move[i][1];
}
//開始移除
for (int i = 0; i < m; i++)
for (int j = move[i][0]; j <= move[i][1]; j++) //末端也需要移除,<=
{
orginal[j] = 0;
}
for (int i = 0; i < 10000; i++)
{
if (orginal[i]) count++;
}
cout << count << endl;
}
參考答案:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int L = 0, M = 0;
cin >> L >> M;
vector<int> sample(L+1);
for (int i = 0; i < L+1; i++)
{
sample[i] = 1;
}
for (int i = 0; i < M; i++)
{
int start = 0, end = 0;
cin >> start >> end;
for (int j = start; j <= end; j++)
{
sample[j] = 0;
}
}
int num = 0;
for (int i = 0; i < L+1; i++)
{
num += sample[i];
}
cout << num << endl;
return 0;
}