《數據結構》 實驗一 順序表

順序表應用1:多餘元素刪除之移位算法

Time Limit: 1000 ms Memory Limit: 650 KiB

Submit Statistic

Problem Description

一個長度不超過10000數據的順序表,可能存在着一些值相同的“多餘”數據元素(類型爲整型),編寫一個程序將“多餘”的數據元素從順序表中刪除,使該表由一個“非純表”(值相同的元素在表中可能有多個)變成一個“純表”(值相同的元素在表中只保留第一個)。
要求:
       1、必須先定義線性表的結構與操作函數,在主函數中藉助該定義與操作函數調用實現問題功能;
       2、本題的目標是熟悉順序表的移位算法,因此題目必須要用元素的移位實現刪除;

Input

 第一行輸入整數n,代表下面有n行輸入;
之後輸入n行,每行先輸入整數m,之後輸入m個數據,代表對應順序表的每個元素。

Output

 輸出有n行,爲每個順序表刪除多餘元素後的結果

Sample Input

4
5 6 9 6 8 9
3 5 5 5
5 9 8 7 6 5
10 1 2 3 4 5 5 4 2 1 3

Sample Output

6 9 8
5
9 8 7 6 5
1 2 3 4 5

Hint

 

Source

順序表應用2:多餘元素刪除之建表算法

Time Limit: 3 ms Memory Limit: 600 KiB

Submit Statistic

Problem Description

一個長度不超過10000數據的順序表,可能存在着一些值相同的“多餘”數據元素(類型爲整型),編寫一個程序將“多餘”的數據元素從順序表中刪除,使該表由一個“非純表”(值相同的元素在表中可能有多個)變成一個“純表”(值相同的元素在表中只保留第一個)。
要求:
       1、必須先定義線性表的結構與操作函數,在主函數中藉助該定義與操作函數調用實現問題功能;
       2、本題的目標是熟悉在順序表原表空間基礎上建新表的算法,要在原順序表空間的基礎上完成完成刪除,建表過程不得開闢新的表空間;
       3、不得采用原表元素移位刪除的方式。

Input

 第一行輸入整數n,代表下面有n行輸入;
之後輸入n行,每行先輸入整數m,之後輸入m個數據,代表對應順序表的每個元素。

Output

  輸出有n行,爲每個順序表刪除多餘元素後的結果

Sample Input

4
5 6 9 6 8 9
3 5 5 5
5 9 8 7 6 5
10 1 2 3 4 5 5 4 2 1 3

Sample Output

6 9 8
5
9 8 7 6 5
1 2 3 4 5

Hint

 

Source

順序表應用3:元素位置互換之移位算法

Time Limit: 1000 ms Memory Limit: 570 KiB

Submit Statistic

Problem Description

一個長度爲len(1<=len<=1000000)的順序表,數據元素的類型爲整型,將該表分成兩半,前一半有m個元素,後一半有len-m個元素(1<=m<=len),藉助元素移位的方式,設計一個空間複雜度爲O(1)的算法,改變原來的順序表,把順序表中原來在前的m個元素放到表的後段,後len-m個元素放到表的前段。
注意:先將順序表元素調整爲符合要求的內容後,再做輸出,輸出過程只能用一個循環語句實現,不能分成兩個部分。

Input

 第一行輸入整數n,代表下面有n行輸入;
之後輸入n行,每行先輸入整數len與整數m(分別代表本表的元素總數與前半表的元素個數),之後輸入len個整數,代表對應順序表的每個元素。

Output

 輸出有n行,爲每個順序表前m個元素與後(len-m)個元素交換後的結果

Sample Input

2
10 3 1 2 3 4 5 6 7 8 9 10
5 3 10 30 20 50 80

Sample Output

4 5 6 7 8 9 10 1 2 3
50 80 10 30 20

Hint

 

注意:先將順序表元素調整爲符合要求的內容後,再做輸出,輸出過程只能在一次循環中完成,不能分成兩個部分輸出。

Source

順序表應用4-2:元素位置互換之逆置算法(數據改進)

Time Limit: 80 ms Memory Limit: 600 KiB

Submit Statistic

Problem Description

一個長度爲len(1<=len<=1000000)的順序表,數據元素的類型爲整型,將該表分成兩半,前一半有m個元素,後一半有len-m個元素(1<=m<=len),設計一個時間複雜度爲O(N)、空間複雜度爲O(1)的算法,改變原來的順序表,把順序表中原來在前的m個元素放到表的後段,後len-m個元素放到表的前段。
注意:交換操作會有多次,每次交換都是在上次交換完成後的順序表中進行。

Input

第一行輸入整數len(1<=len<=1000000),表示順序表元素的總數;

第二行輸入len個整數,作爲表裏依次存放的數據元素;

第三行輸入整數t(1<=t<=30),表示之後要完成t次交換,每次均是在上次交換完成後的順序表基礎上實現新的交換;

之後t行,每行輸入一個整數m(1<=m<=len),代表本次交換要以上次交換完成後的順序表爲基礎,實現前m個元素與後len-m個元素的交換;

Output

輸出一共t行,每行依次輸出本次交換完成後順序表裏所有元素。

Sample Input

10
1 2 3 4 5 6 7 8 9 -1
3
2
3
5

Sample Output

3 4 5 6 7 8 9 -1 1 2
6 7 8 9 -1 1 2 3 4 5
1 2 3 4 5 6 7 8 9 -1

Hint

Source

順序表應用5:有序順序表歸併

Time Limit: 100 ms Memory Limit: 880 KiB

Submit Statistic

Problem Description

已知順序表A與B是兩個有序的順序表,其中存放的數據元素皆爲普通整型,將A與B表歸併爲C表,要求C表包含了A、B表裏所有元素,並且C表仍然保持有序。

Input

 輸入分爲三行:
第一行輸入m、n(1<=m,n<=10000)的值,即爲表A、B的元素個數;
第二行輸入m個有序的整數,即爲表A的每一個元素;
第三行輸入n個有序的整數,即爲表B的每一個元素;

Output

 輸出爲一行,即將表A、B合併爲表C後,依次輸出表C所存放的元素。

Sample Input

5 3
1 3 5 6 9
2 4 10

Sample Output

1 2 3 4 5 6 9 10

Hint

Source

順序表應用6:有序順序表查詢

Time Limit: 1000 ms Memory Limit: 4096 KiB

Submit Statistic

Problem Description

順序表內按照由小到大的次序存放着n個互不相同的整數,任意輸入一個整數,判斷該整數在順序表中是否存在。如果在順序表中存在該整數,輸出其在表中的序號;否則輸出“No Found!"。

Input

 第一行輸入整數n (1 <= n <= 100000),表示順序表的元素個數;
第二行依次輸入n個各不相同的有序非負整數,代表表裏的元素;
第三行輸入整數t (1 <= t <= 100000),代表要查詢的次數;
第四行依次輸入t個非負整數,代表每次要查詢的數值。

保證所有輸入的數都在 int 範圍內。

Output

 輸出t行,代表t次查詢的結果,如果找到在本行輸出該元素在表中的位置,否則本行輸出No Found!

Sample Input

10
1 22 33 55 63 70 74 79 80 87
4
55 10 2 87

Sample Output

4
No Found!
No Found!
10

Hint

Source

順序表應用7:最大子段和之分治遞歸法

Time Limit: 10 ms Memory Limit: 400 KiB

Submit Statistic

Problem Description

 給定n(1<=n<=50000)個整數(可能爲負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。當所給的整數均爲負數時定義子段和爲0,依此定義,所求的最優值爲: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n。 例如,當(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)時,最大子段和爲20。

 

注意:本題目要求用分治遞歸法求解,除了需要輸出最大子段和的值之外,還需要輸出求得該結果所需的遞歸調用總次數。

 

遞歸調用總次數的獲得,可以參考以下求菲波那切數列的代碼段中全局變量count的用法:

#include
int count=0;
int main()
{
    int n,m;
    int fib(int n);
    scanf("%d",&n);
    m=fib(n);
    printf("%d %d\n",m,count);
    return 0;
}
int fib(int n)
{
    int s;
    count++;
    if((n==1)||(n==0)) return 1;
    else s=fib(n-1)+fib(n-2);
    return s;
}
 

Input

第一行輸入整數n(1<=n<=50000),表示整數序列中的數據元素個數;

第二行依次輸入n個整數,對應順序表中存放的每個數據元素值。

Output

一行輸出兩個整數,之間以空格間隔輸出:

第一個整數爲所求的最大子段和;

第二個整數爲用分治遞歸法求解最大子段和時,遞歸函數被調用的總次數。

Sample Input

6
-2 11 -4 13 -5 -2

Sample Output

20 11

Hint

Source

順序表應用8:最大子段和之動態規劃法

Time Limit: 5 ms Memory Limit: 500 KiB

Submit Statistic

Problem Description

 給定n(1<=n<=100000)個整數(可能爲負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。當所給的整數均爲負數時定義子段和爲0,依此定義,所求的最優值爲: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n。 例如,當(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)時,最大子段和爲20。

 

注意:本題目要求用動態規劃法求解,只需要輸出最大子段和的值。

Input

第一行輸入整數n(1<=n<=100000),表示整數序列中的數據元素個數;

第二行依次輸入n個整數,對應順序表中存放的每個數據元素值。

Output

輸出所求的最大子段和

 

Sample Input

6
-2 11 -4 13 -5 -2

Sample Output

20

Hint

Source

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章