【问题描述】

一个集合有如下元素:1是集合元素;若P是集合的元素,则2 * P +1,4*P+5也是集合的元素,取出此集合中最小的K个元素,按从小到大的顺序组合成一个多位数,现要求从中删除M个数位上的数字,使得剩下的数字最大,编程输出删除前和删除后的多位数字。

注:不存在所有数被删除的情况。

【样例输入】

5 4

【样例输出】

137915

95

【解题思路】

首先,我们可以将该问题转化为两个子问题:

1:求2*p+1与4*p+5两个集合中前k个数组成的数。

2:求如何删去m个数字使留下的数最大,并输出该数。

对于子问题1,其实是很好办的,直接将两个集合转化为两个队列,取走两个队列中更小的队首元素,并将其扩展放入到两个集合中,直到取出了k个数。

那么关键在于如何解决子问题2。

既然要使留下的数最大,那么自然是越高位越大越好,于是,对于某一个数字是取还是舍,我们应遵循下面两个原则:

1:如果该数字比其之前的数字大,那么我们应尽量舍去之前的数字。

2:如果舍去的数字已经有m个了,那就不必舍去了。

因此,对于每一个数字,我们应把它与它前面的数字进行比较,如果满足上述两个原则,那么就取代其之前的数。详见代码。

【代码实现】

var t,k:array[..] of longint;
sta:array[..] of char;
t1,t2,i,n,m,l,top,r1,r2:longint;
s,st:ansistring;
begin
readln(n,m);
i:=;
t[]:=;
k[]:=;
t1:=;
t2:=;
r1:=;
r2:=;
s:='';
while i<n do
if t[r1]<k[r2] then
begin
inc(i);
str(t[r1],st);
s:=s+st;
inc(t1);
t[t1]:=*t[r1]+;
inc(t2);
k[t2]:=*t[r1]+;
inc(r1);
end
else
begin
inc(i);
str(k[r2],st);
s:=s+st;
inc(t1);
t[t1]:=*k[r2]+;
inc(t2);
k[t2]:=*k[r2]+;
inc(r2);
end;
writeln(s);//解决子问题1
l:=length(s);
m:=l-m;
sta[]:=chr();
top:=;
for i:= to l do
begin
while(s[i]>sta[top-])and(top+l-i>m)do//满足两个原则,取代
dec(top);
sta[top]:=s[i];
inc(top);
end;
for i:= to top- do
if sta[i]<>'' then
break;//注意:前导0不要输出
for i:=i to m do
write(sta[i]);
writeln;
end.

集合删数 (vijos 1545) 题解的更多相关文章

  1. [Swust OJ 403]--集合删数

    题目链接:http://acm.swust.edu.cn/problem/403/ Time limit(ms): 5000 Memory limit(kb): 65535   Description ...

  2. 题解 洛谷 P5324 【[BJOI2019]删数】

    先考虑对于一个序列,能使其可以删空的的修改次数. 首先可以发现,序列的排列顺序是没有影响的,所以可以将所有数放到桶里来处理. 尝试对一个没有经过修改的可以删空的序列来进行删数,一开始删去所有的\(n\ ...

  3. 删数方案数(regex)

    [题目描述] 给出一个正整数序列 a,长度为 n,cyb 不喜欢完美,他要删掉一些数(也可以不删,即删掉0个),但是他不会乱删,他希望删去以后,能将 a 分成 2 个集合,使得两个非空集合的数的和相同 ...

  4. 【BZOJ2734】【HNOI2012】集合选数(状态压缩,动态规划)

    [BZOJ2734][HNOI2012]集合选数(状态压缩,动态规划) 题面 Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所 ...

  5. [BJOI2019]删数(线段树)

    [BJOI2019]删数(线段树) 题面 洛谷 题解 按照值域我们把每个数的出现次数画成一根根的柱子,然后把柱子向左推导,\([1,n]\)中未被覆盖的区间长度就是答案. 于是问题变成了单点修改值,即 ...

  6. 【BZOJ-2732】集合选数 状压DP (思路题)

    2734: [HNOI2012]集合选数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1070  Solved: 623[Submit][Statu ...

  7. codevs4096 删数问题

    题目描述 Description 键盘输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序将组成一个新的正整数.编程对给定的N 和S,寻找一种方案使得剩下的数字组成的新数最小. 输入 ...

  8. bzoj 2734: [HNOI2012]集合选数 状压DP

    2734: [HNOI2012]集合选数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 560  Solved: 321[Submit][Status ...

  9. 1145: 零起点学算法52——数组中删数II

    1145: 零起点学算法52--数组中删数II Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 293 ...

随机推荐

  1. java类包第十一章

    1.同一个包中的类互相访问,不需要制定包名. 2.java中包名的规则是全部使用小写字母 3.final 方法不能被覆盖, public class OuterClass {    innerClas ...

  2. LPC1788 SDRAM运行程序

    折腾了很久 终于解决了 从SDRAM中运行APP程序. 说明:LPC1788 本身有512K的flash和96K的RAM.支持TFT和SDRAM 这算是跟别家cortex-M3架构MCU相比较的一个亮 ...

  3. 多线程(三)GCD

    一.GCD GCD:Grand Central Dispatch,宏大的中央调度!!!是苹果为多核的并行运算提出的解决方案,会自动合理地利用更多的CPU内核(比如双核.四核), GCD的底层依然是用线 ...

  4. nginx 完全关闭 access_log

    修改nginx.config access_log off;

  5. 关闭GS选项,解决注入后崩溃

    利用CreateRemoteThread向进程注入远程代码时,一般会有以下两种做法: 利用LoadLibrary在目标进程加载指定的DLL 将代码复制到目标进程,然后启动这段代码 上面的第二种方法其实 ...

  6. Android控件大全(三)——RecyclerView

    是时候用RecyclerView来替换ListView和GridView了 好处就不多说了,百度一搜一大把,来介绍下用法 先定义个适配器: public class BottomSheetAdapte ...

  7. C# 请求外部服务的办法

    )     {                returnMenuBeizhu = ;             ).ToString()                         borrowT ...

  8. C# 发送邮件3

    C#邮件发送 这篇文章主要介绍如何使用C#的MailAddress类进行邮件的发送. 1.首先引入命名空间using System.Net.Mail; 2.将发送的邮件的功能封装成一个类,该类中包含了 ...

  9. ajax 的简单应用

    ajax作为前端技术,采用异步方式,根据其采用的方式来讲,不用刷新界面,只是进行数据的传递. 后台还是用servlet的.servlet接收到ajax的get或post请求后.将数据组装成xml或者j ...

  10. windows7安装远程服务器AD域管理工具

    目的:在win7上安装“远程服务器管理工具”,这样可以在客户端进行对服务器的AD域的操作,避免了远程登陆进服务器的麻烦. 前提条件:一般此工具只有管理员才具有有效使用权限,所以,在域administr ...