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