题意:给你一个数, 要求删去一些数字, 使得剩下的数字最大。
这道题用贪心解决。
大家想一想, 两个数比较大小, 肯定先比较第一位的数,然后依次比较第二位,以此类推。
既然我们要保证最后的数字最大, 那么一定要先保证第一位数的最大, 然后保证第二位数最大,以此类推。
所以贪心策略就是在能删除的范围内选择最大的数字,把最大的数字之前的数字删除, 把最大的数字留在最前面
然后一直这么做下去就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; }