1. 程式人生 > >排序演算法初步

排序演算法初步

1.p1065 挑選球員

選擇排序板子題
描述 Description
有n個球員,現在要把他們分成兩隊,讓他們打比賽。每個人都有一個技巧值,有兩個教練, 教練A和教練B, 這兩個教練輪流挑選球員,這兩個教練每次都是從當前剩下的球員中挑選技巧值最大的球員。第一次是教練A先挑選。當教練A和教練B挑完球員後,問:教練A挑選的球員的技巧總和比教練B挑選的球員的技巧總和大多少?
例如:有5個球員,技巧值分別是:{5,7,8,4,2}, 那麼教練A先選8,教練B選7,教練A選5,教練B旋4,教練A選2. 最後教練A選到的總和是:15,教練B選到的總和是:11, 所以你應該輸出4。
輸入格式 Input Format
第一行:一個整數n, 1 <= n <= 50
第二行: n個非負整數,第i個整數表示第i個球員的技巧值, 技巧值不超過10000。
輸出格式 Output Format
  一行:一個整數,教練A挑選的球員的技巧總和比教練B挑選的球員的技巧總和大多少?
樣例輸入 Sample Input

4
9 8 7 6

樣例輸出 Sample Output

2
時間限制 Time Limitation
1s

程式碼

#include<iostream>
using namespace std;
int num[1110];
int a,c,i,m,n,temp;
int main()
{
	cin >> n;
	for(i=1;i<=n;i++) cin>>num[i];
	for(i=1;i<n;i++)
	{
		int k=i;
		for(int j=i+1;j<=n;j++)
		if(num[j]>
num[k]) k=j; if(k!=i) {temp=num[i];num[i]=num[k];num[k]=temp;} } for(i=1;i<=n;i++) { if(i%2==0) a+=num[i]; else c+=num[i]; } int d=c-a; cout << d <<' '; return 0; }

2.p1067 車廂重組

氣泡排序板子題
描述 Description
在一箇舊式的火車站旁邊有一座橋,其橋面可以繞河中心的橋墩水平旋轉。一個車站的職工發現橋的長度最多能容納兩節車廂,如果將橋旋轉180度,則可以把相鄰兩節車廂的位置交換,用這種方法可以重新排列車廂的順序。於是他就負責用這座橋將進站的車廂按車廂號從小到大重新排列。他退休之後,火車站決定將這一工作自動化,其中一項重要的工作是編一個程式,從輸入檔案讀入列車初始的車廂順序,計算最少用多少步就能將車廂排序,把最少的步數記錄在輸出檔案中。
輸入格式 Input Format
第一行為一個正整數n(n<=10000) 第二行為n個整數,表示初始的車廂的順序
輸出格式 Output Format
一個正整數,表示最少的旋轉次數
樣例輸入 Sample Input

4
4 3 2 1
樣例輸出 Sample Output

6
時間限制 Time Limitation
1s

程式碼

#include<iostream>
#include<algorithm>
using namespace std;
int num[100000];
int m,n,temp;
int main(){
	cin >> n;
	for(int i=1;i<=n;i++) cin >> num[i];
    for(int i=1;i<n;i++)
	{
    	for(int j=1;j<=n-i;j++)
		{
    		if(num[j]>num[j+1]){
    			temp=num[j];
    			num[j]=num[j+1];
    			num[j+1]=temp;
    			m++;
			}
    		
		}
	}
	cout << m <<endl;
	return 0; 
}

3.p1070 接水問題

sort排序板子題
描述 Description
有N個人提著不同大小的水桶來接水,因為水桶大小不同,每個桶接滿的時間也各不相同。

現在問你,給你每個人接水需要的時間,如何安排接水,讓所有人等待的時間最少。

1<=N<=1000。
輸入格式 Input Format
第一行一個整數 N
後面有N行,每行一個整數Ai(1<=A<=100),第i個人接滿水需要的時間,單位是秒。
輸出格式 Output Format
所有人把桶接滿,等待時間的累加和。
樣例輸入 Sample Input

3
2
8
3
樣例輸出 Sample Output

20 ( 先第一個人,再第三個,最後第二個)
時間限制 Time Limitation
1s
註釋 Hint
本題輸出的是所有人等待時間的累加和。
如樣例3
   2
   8
   3

第一個人接水用2秒,3個人等待6秒;然後第三個人接水(按最小值來算)3秒,2個人等待6個秒;第三個人需要8秒,1個人等待8秒。
來自楊重遠
來源 Source
1s

此題貪心的嚴格證明方法:排序不等式(自行百度或參考數學選修4-5)
                  ————來自鄭懿鳴

程式碼

#include<iostream>
#include<algorithm>
using namespace std;
int num[110];
int n,i,t;
int main()
{
	cin >>n;
	for(i=1;i<=n;i++)  cin >> num[i];
	int b=n; 
    sort(num+1,num+n+1);
	for(i=1;i<=n;i++){
		t=t+b*num[i];
		b--;
	}
	cout<<t<<' ';
	return 0;
}