【闯王的宝藏】 水题 链表

闯王的宝藏

题目描述

【题目背景】

明朝后期,由于皇帝腐朽无能,宦官专权,政治黑暗腐败。官僚地主霸占了全国绝大部 分的良田沃土,很多农民失去了土地,政府还不断地向农民征收赋税,困苦不堪的农民又遭 到蝗灾、旱灾等自然灾害。在这种情况下,农民起义迅速地在全国酝酿,公元 1627 年,农 民起义首先在灾情严重的陕北爆发。农民战争发展迅猛,短短几年内,就涌现出几十支起义 军,其中以高迎祥领导的起义军规模最大。高迎祥死后,起义军主要有两支:一支由张献忠 率领,另一支由李自成率领。

1641 年,李自成起义军攻占了洛阳,活捉并杀死了福王朱常洵,没收王府中的财物, 分给老百姓。1644 年,李自成在西安建立了大顺政权,同年,乘胜进攻北京,明朝最后一 个皇帝崇祯在煤山(今北京景山)上吊自杀,三月,李自成大军占领了北京。

农民军进了北京之后,严整军纪。大顺政权命令明朝的贵族、官僚、富户交出大量钱财, 还镇压了一批罪大恶极的达官贵人,大顺政权控制了长城以南、淮河以北的广大地区。

李自成进北京的消息传到关外,满清摄政王多尔衮急忙率兵南下,降服了驻守山海关的 明将吴三桂。不久,李自成亲自率农民军同吴三桂的军队和清军在山海关展开大战,农民军 战败。李自成被迫率军撤出北京,转战于河南、陕西等地。1645 年,李自成战死于湖北九 宫山。

【问题描述】 传说当年闯王战败,曾经将在北京夺得的财物汇集在一起,埋在淮河以南的某处地方。

不久之前,CZYZ 的天才国一少年 NKF 发现惊天秘密,闯王的宝藏就在 CZYZ 下面。NKF 单枪 匹马闯入其中,过五关斩六将终于到达最后一关,结果竟然看到门上有这样一个题目:一个 长度为 N 的数字串,要求在这串数字中删去 K 个数字使剩下的数最小。这实在是太简单了, NKF 决定还是决定把这个任务交给你们这些学弟学妹,看看你们和他当初的差距有多大~

输入

只有两行。

第一行包含一个 N 位的整数,每一位为 0-9 中的一个,不含前导 0。 第二行包含 1 个正整数 K,具体含义如题中所示。

输出

只有一行,为删数后最小的数,不含前导 0。 特别的,如果删数后最小的数为 0,请输出一个 0,不含前导 0。

样例输入

20131
3

样例输出

1

提示

样例解释:删掉数字 A 的第 1   3   4 位,得到数字 B 为“01”,去除前导 0。


【数据范围】


对于 50%的数据,N<=100000;


对于 100%的数据,N<=5000000,0<=K<=N。

 

水题,只是字符串比较难。贪心好想,用个链表完美了。

直接上程序吧,Pascal的。

 

var i,j,k,t,L:longint;
    s:array[0..5000001] of char;
    head,next:array[-2..5000001] of longint;
begin
  i:=0;
  while not (eoln) do
  begin
    inc(i);
    read(s[i]);
  end;
  readln(k);
  if k=0 then
  begin
    for j:=1 to i do
      write(s[i]);
    writeln;
    halt;
  end;
  L:=i;
  head[1]:=-1; next[L]:=-1;
  next[1]:=2; head[L]:=L-1;
  for i:=2 to L-1 do
  begin
    head[i]:=i-1;
    next[i]:=i+1;
  end;
  i:=1;
  while (i<>-1) do
  begin
    j:=next[i];
    if (s[i]>s[j]) then
    begin
      s[i]:=#0;
      head[j]:=head[i];
      next[head[i]]:=j;
      dec(k);
      t:=head[i];
      while (k>0)and(t<>-1)and(s[t]>s[j]) do
      begin
        if s[t]='0'
        dec(k); s[t]:=#0;
        head[j]:=head[t];
        t:=head[t];
        if t<>-1 then next[t]:=j;
      end;
      i:=next[i];
      if head[i]=-1 then
      begin
      end;
    end;
  end;
end.
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值