順序表應用1:多餘元素刪除之移位算法
Time Limit: 1000 ms Memory Limit: 650 KiB
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
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
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
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
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
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
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
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