1. 程式人生 > >貪心演算法4:刪數問題

貪心演算法4:刪數問題

題目描述

鍵盤輸入一個高精度的正整數N,去掉其中任意kk個數字後剩下的數字按原左右次序將組成一個新的正整數。程式設計對給定的N和k,尋找一種方案使得剩下的數字組成的新數最小。

輸出應包括所去掉的數字的位置和組成的新的整數。(N不超過250位) 輸入資料均不需判錯。

Simple Input

 178543

 4

Simple Output

 13

貪心策略:每次刪掉的數都要保證刪除數後剩下的數最小。即就是每次都要刪除第一個遞減區間的第一個數。

本題容易犯錯的地方,不能每次都刪除最大的數。

例如:141519 2 //如果刪最大的9,5,結果為1411,如果刪掉4,5,結果為1119,顯然刪掉4,5才是最佳答案。

刪除字串中的第一個遞減區間的數

#include<iostream>
#include<cstring>
#define MAXN 255
using namespace std; 
char a[MAXN];
int main()
{
	//freopen("a.txt","r",stdin);
	cin >> a;
	int n = strlen(a);
	int m;
	cin >> m;
	while(m--)
	{
		for(int i = 0; i < n; ++i)
		{
			if(a[i] > a[i+1]) 
			{
				for(int k = i; k < n; ++k)//指標往前移動 
				{
					a[k] = a[k+1];
				}
			}
			break;//第一次刪數完畢,跳出迴圈 
		}
		--n;		
	}
	bool flag = false;
 	for(int i = 0; i < n; ++ i)
 	{
 		if(a[i] != '0') flag = true;//刪除串首的零 
 		if(flag) cout << a[i];
	}
	if(!flag) cout << "0" << endl;
	cout << endl;
	return 0;
}