zoukankan      html  css  js  c++  java
  • 紫书 习题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;
    }

  • 相关阅读:
    Oracle11g 安装 -Linux
    oracle 11g安装-window
    将本地文件上传到github
    highcharts实现画辅助线功能并删除
    eclipse中一个项目引用另一个项目的方法
    Kubernetes label简单使用
    spark 报错 InvalidClassException: no valid constructor
    NFS服务配置 Linux
    Ubuntu-Server18.04开启无线网卡并配置静态ip
    Ubuntu18.04安装mysql并配置远程访问
  • 原文地址:https://www.cnblogs.com/sugewud/p/9819579.html
Copyright © 2011-2022 走看看