排序演算法初步
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;
}