加载中
加载中
表情图片
评为精选
鼓励
加载中...
分享
加载中...
文件下载
加载中...
修改排序
加载中...
集合删数问题求指教
绝对领域2013/05/18软件综合 IP:重庆
【问题描述】


  给出一个N位数字串,删除任意K位,使剩下的数最大。




【输入】


  第1行:2个整数N和K(1<=K<=N<=500000)
  第2行:N个非全0数字。




【输出】


  第1行:1个可行到的最大的数


下面是我的想法:


由于给定的位数是确定的,删除的位数也是确定的,所以剩下的数一定是一个M位数,只要让最高位最大就能使最后的数最大
我的贪心是每次从数字串中最高位可能的选择情况中选取一个最大的数作为最高位
例如 5 4 6 8 9 中删除要两个数,剩下一个三位数,所以最高位只能从5 4 6 中选择,显然应该选6,所以删除 5 4 然后原问题转化为在 8 9 中删除零个数,所以最后的结果是 6 8 9
假如有些位上的数是相等的比如 4 9 9 9 9 5中删3个数,剩下一个三位数,最高位从4 9 9 中选,将第一个9作为最高位,删除4,再递归求解,保证了被删除的数一定是小于当前选为最高位的数
来自:计算机科学 / 软件综合
3
新版本公告
~~空空如也
绝对领域 作者
12年4个月前 IP:未同步
526685
下面是我自己写的程序
有一个大数据是在是调不出来。。
#include<stdio.h>
#include<stdlib.h>
int d[500050],f[500050],k=1;
char s[500050];
int N,K;
void deal(int a,int b,int i)//当前需要删除i个数,要在区间[a,b]中选出一个最大的数字作为该位上的数字
{
    int temp;
    if(i==0)//删除完毕,退出
    {
        for(int x=a;x<=b;x++)
            d[k++]=f[x];
        return;
    }
    int n=b-a+1;//区间长度
    int max=0;
    for(int x=0;x<=i;x++)
        if(f[a+x]>max)
        {
            max=f[a+x];
            temp=a+x;//记录当前选取数的位置
        }
    d[k++]=max;
    deal(temp+1,b,i-(temp-a));
}
void change()
{
    for(int i=0;i<N;i++)
        f[i+1]=s[i]-48;
}
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    scanf("%d %d",&N,&K);
    scanf("%s",s);
    change();
    deal(1,N,K);
    for(int i=1;i<=N-K;i++)
        printf("%d",d[i]);
    return 0;
}
attachment icon 1.txt 54.71KB TXT 27次下载

attachment icon in.txt 97.67KB TXT 29次下载
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的