紫书 习题8-4 UVa 11491 (贪心)

题意:给你一个数, 要求删去一些数字, 使得剩下的数字最大。

这道题用贪心解决。

大家想一想, 两个数比较大小, 肯定先比较第一位的数,然后依次比较第二位,以此类推。

既然我们要保证最后的数字最大, 那么一定要先保证第一位数的最大, 然后保证第二位数最大,以此类推。

所以贪心策略就是在能删除的范围内选择最大的数字,把最大的数字之前的数字删除, 把最大的数字留在最前面

然后一直这么做下去就ok了。

比如3759, 能删两个数。也就是说第一位要不是3要不是7要不是5, 7最大, 所以保留7, 删去3。然后

还能删去1个数字。目前的数字是759, 7已经确定为第一位了,不理它,现在确定第二位。

只能删一个数的时候, 第二位要不是5要不是是9, 留下9删去5.

所以答案是79.

#include<cstdio>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;

const int MAXN = 112345;
int a[MAXN], n, d;

int main()
{
	while(~scanf("%d%d", &n, &d) && n && d)
	{
		REP(i, 0, n) scanf("%1d", &a[i]);
		int temp = d;
		
		int pos = 0;
		while(d > 0 && pos < n)  //pos < n 不能省去, 不然会RE
		{
			int ma = -1, t = pos;
			REP(i, t, t + d + 1)
				if(a[i] > ma)
				{
					pos = i;
					ma = a[i];
				}
			REP(i, t, pos) a[i] = -1, d--;
			pos++; //删完后从下一位开始继续找
		}
		
		
		int num = n - temp; 
		REP(i, 0, n)
			if(a[i] != -1)
			{
				printf("%d", a[i]);
				num--;
				if(num == 0) break; //一共只能有n-d个数, 剩下的不要
			}
				
		puts("");
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_34416123/article/details/80177165