【貪心算法】刪數問題

貪心算法

顧名思義,貪心算法總是做出在當前看來是最好的選擇。也就是說貪心算法並不從整體最優上加以考慮,它所做出的選擇只是在某種意義上的局部最優選擇。當然,我們希望貪心算法得到的結果也是整體最優的。在一些問題中,即使貪心算法不能得到整體最優解,但其最終結果卻是最優解的很好的近似解。

題目

Problem Description
鍵盤輸入一個高精度的正整數n(≤100位),去掉其中任意s個數字後剩下的數字按照原來的左右次序組成一個新的正整數。編程對給定的n與s,尋找一種方案,使得剩下的數字組成的新數最小。
Input
輸入有多組 每組包括原始數n,要去掉的數字數s;
Output
輸出去掉s個數後最小的數
Sample Input
178543 4
Sample Output
13

思想

假如有一排數字,共n個
2342543234321432
我們刪除s個,從第一個數字往後找,當碰到逆序進行刪除操作,再進行從前往後找,直至刪除了對應的次數(s次),或者是走到了數字末尾(能走到末尾說明以及找不到逆序了)
如果是走到了數字末尾,那麼我們很有可能沒有刪夠足夠的位數,因爲數字中已經沒有逆序,是按從小到大的順序來排列的,因此我們就取前面的(n-s)位數字即可。

算法

#include <stdio.h>
#include <string.h>
#define M 100
int main(void){
	int n,length;
	//輸入要刪的數的個數 
	char arr[M]; 
	scanf("%d",&n);
	scanf("%s",arr);
	length = strlen(arr);
	if(n == 0){
		return 0;
	}else if(n>=length){
		return 0;
	}else{
		int i = 0;//記錄下標,看看有沒有走到最後 
		int num = 0;//記錄刪數的個數 
		int newLength = length; 
		//new Length-1是爲了防止和'\0'交換產生逆序
		while(i<newLength-1&&num<=n){
			//從頭開始找 
			//如果產生了逆序
			if(arr[i]>arr[i+1]){
				num++;
				//把數字往前移 
				for(int j = i;j<newLength;j++){
					arr[j] = arr[j+1];
				}
				//把長度減減 
				newLength--;
				i=-1;
			}
			i++;
		}
	}
	for(int i = 0;i<length-n;i++){
		printf("%c",arr[i]);
	}
	return 0;
}

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