【ACM入門】入門問題

最大利益問題

#include <iostream>
#include <algorithm>

using namespace std; 
static const int MAX = 200000; 

int main() {
	int R[MAX], n;
	
	cin >> n;
	for(int i = 0; i < n; i++) cin >> R[i];
	
	int maxv = -200000000;
	int minv = R[0];
//	關鍵找到前面的最小的,和後面的最大的 
	for(int i = 1; i < n; i++) {
		maxv = max(maxv, R[i] - minv); /***/
		minv = min(minv, R[i]); /****/
	} 
	cout << maxv <<endl;
	return 0;                  	
}

初等排序

插入排序

撲克牌排列手牌,把無序的放到有序的中。

#include <stdio.h>

void trace(int A[], int N) {
	int i;
	for ( i = 0; i < N; i++) {
		if (i > 0) printf(" ");
		printf("%d", A[i]);
	}
	printf("\n");
} 

void insertionSort(int A[], int N) {
	int j, i, v;
	for(i = 1; i < N; i++) {
		v = A[i]; //待移動的數暫時保存A[i]
		j = i - 1; //從後往前找第一個小於A[i]的數的下標
		while(j >= 0 && A[j] > v) {
			A[j+1] = A[j]; //如果存在 ,整體往後移
			j--; 
		} 
		A[j+1] = v;
		trace(A, N);
		 
	}
}

int main() {
	int N, i, j;
	int A[100];
	
	scanf("%d", &N);
	for( i = 0; i < N; i++) scanf("%d", &A[i]);
	
	trace(A, N);
	insertionSort(A, N);
	return 0;
}

冒泡排序


void bubbleSort(int A[], int N) {
	int sw = 0;//交換次數 
	bool flag = 1;
//	如果一輪沒有發生交換,循環結束 
	for (int i = 0; flag; i++) {
		flag = 0; //表示次輪還沒開始交換 
		for (int j = N - 1; j >= i + 1; j--) {
			if( A[j] < A[j - 1]) {
//				如果後面的比前面小交換
				swap(A[j], A[j - 1]); // iostream 
				flag = 1; // 表示交換了
				sw++ 
			}
		}
	}
}

選擇排序

int selectionSort(int A[], int N) {
	int i, j, t, sw = 0, minj;
	for( i = 0; i < N - 1; i++) {
		minj = i; //記錄自小值的下標
		for(j = i; j < N; i++) {//獲取未排序數中的最小值
			minj = i;
			for (j = i; j < N; j++) {
				if( A[j] < A[minj]) minj = j;
			}
		}
		t = A[i]; A[i] = A[minj]; A[minj] = t;
		if( i != minj ) sw++;
	}
	return sw;
} 

 

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