当前位置: 代码迷 >> 综合 >> 紫书 习题8-4 UVa 11491 (贪心)
  详细解决方案

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

热度:83   发布时间:2023-09-20 22:03:16.0

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

这道题用贪心解决。

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

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

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

然后一直这么做下去就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;
}