就是从n位数中取出n-d个数字按顺序排成一排组成一个新数使得其最大

算法:

从前往后确定每一位。找第i位时,要求后面留下d-i位的空间,

因此第i位应该从第i-1位原来位置+1到第d+i位寻找

用线段树确定区间最大值(其实直接用优先队列就行了,可能会多一些多余的出队操作)

更好的算法:

***引用

后来看到一个博客写的特别巧妙,

每读取一个字符,如果ans中有字符,且如果删除一个字符后面的数字数量依然够的话,

并且ans中最后一个数字比新读取的小,那么删除最后一个字符,把新读取的字符加入ans.

http://www.cnblogs.com/jihe/p/4883573.html***

#include<cstdio>
#include<algorithm>
using namespace std;
int c[300010];
int ans[300010];
int n,d;
struct Node
{
int lc,rc,l,r,maxpos;
}node[1000010];
int num_node;
int getnode()
{
return num_node++;
}
int build(int l,int r)
{
int _tmp=getnode();
node[_tmp].l=l;
node[_tmp].r=r;
if(l==r)
{
node[_tmp].maxpos=l;
return _tmp;
}
int m=(l+r)>>1;
node[_tmp].lc=build(l,m);
node[_tmp].rc=build(m+1,r);
if(c[node[node[_tmp].lc].maxpos]<c[node[node[_tmp].rc].maxpos])
node[_tmp].maxpos=node[node[_tmp].rc].maxpos;
else
node[_tmp].maxpos=node[node[_tmp].lc].maxpos;
return _tmp;
}
int query(int L,int R,int nownode)
{
int l=node[nownode].l;
int r=node[nownode].r;
if(L<=l&&r<=R)
return node[nownode].maxpos;
int t,ans=n+1,m=(l+r)>>1;
if(L<=m)
{
t=query(L,R,node[nownode].lc);
if(c[ans]<c[t])
ans=t;
}
if(R>m)
{
t=query(L,R,node[nownode].rc);
if(c[ans]<c[t])
ans=t;
}
return ans;
}
int main()
{
int i,t;
scanf("%d%d",&n,&d);
while(n!=0&&d!=0)
{
num_node=0;
t=0;
for(i=1;i<=n;i++)
scanf("%1d",&c[i]);
c[n+1]=-1;
build(1,n);
for(i=1;i<=n-d;i++)
{
t=query(t+1,d+i,0);
printf("%d",c[t]);
}
printf("\n");
scanf("%d%d",&n,&d);
}
return 0;
}

从一个n位数中选出m位按顺序组成新数并使其最大 || Erasing and Winning UVA - 11491的更多相关文章

  1. 用MFC完成一个简单的猜数字游戏: 输入的四位数中,位置和数字都正确为A,数字相同而位置不同的为B。

    最近学习了MFC一些比较基础的知识,所以打算通过做一个简单的数字游戏来理解MFC的流程并进一步熟悉其操作. 在这里,我做了一个猜数字的小游戏.第一步当然是设计主界面,先给大家展示一下游戏界面: 主界面 ...

  2. 编写Java程序_输入一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。

    要求: 输入一个5位数,判断它是不是回文数.即12321是回文数,个位与万位相同,十位与千位相同. 实现代码: package kaoshi; import java.util.Scanner; pu ...

  3. [转]趣题:一个n位数平均有多少个单调区间?---- From Matrix67

    考虑这么一个 14 位数 02565413989732 ,如图所示,它的数字先逐渐变大,然后开始变小,再变大,再变小,再变大,再变小.我们就说,它一共包含了 6 个单调区间.我们的问题就是:一个 n ...

  4. 将十进制数转为一个n位数的密码(每位都是个m进制数)

    例如一个6位数的10进制密码,共有106个密码,如果把每个6位数的密码编成号就是[0,106-1].这是十进制的情况,即6个位,每个位有10种选择.如果要遍历所有密码,需要6重for循环,每个循环10 ...

  5. 数字序列中某一位数字(《剑指offer》面试题44)

    由于这道题目在牛客上没有,所以在此记录一下. 一.题目大意: 数字以0123456789101112131415…的格式序列化到一个字符序列中.在这个序列中,第5位(从0开始计数,即从第0位开始)是5 ...

  6. ZT 计算一个无符整数中1Bit的个数(1) 2010-04-20 10:52:48

    计算一个无符整数中1Bit的个数(1) 2010-04-20 10:52:48 分类: C/C++ [转]计算一个无符整数中1Bit的个数(1)   Count the number of bits ...

  7. C/C++中的64位整数

    C/C++中的64位整数(__int64 and long long) 在做ACM题时,经常都会遇到一些比较大的整数.而常用的内置整数类型常常显得太小了:其中long 和 int 范围是[-2^31, ...

  8. 【Offer】[44] 【数字序列中某一位的数字】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 数字以0123456789101112131415..的格式序列化到一个字符序列中.在这个序列中,第5位(从0开始计数)是5,第13位是 ...

  9. 剑指offer——46数字序列中某一位的数字

    题目: 数字以0123456789101112131415…的格式序列化到一个字符序列中.在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等.请写一个函数,求任意第n位对应的数 ...

随机推荐

  1. STL review:vector & string & map & struct

    I.vector 1.头文件:#include<vector>                        //容器vector是一个能实现随机存取.插入删除的动态数组,还可以当栈使. ...

  2. Tomcat 安装与配置规范

    Tomcat 安装 演示版本:8.5.32 安装版 JDK推荐版本:jdk1.8 下载地址:https://tomcat.apache.org/download-80.cgi 安装教程 注意:tomc ...

  3. C# partial分部类和分部方法

    1.https://www.cnblogs.com/xcsn/p/7533238.html 它是一个关键字修饰符.可以将类或结构.接口或方法的定义拆分到两个或更多个源文件中. 每个源文件包含类型或方法 ...

  4. iOS开发UIScrollView常见属性和方法

    一.ScrollView常用方法和属性 @property(nonatomic)CGPoint contentOffset; 设置滚动的偏移量 @property(nonatomic)CGSize c ...

  5. (linux)mmccard驱动的读写过程解析

      mmc io的读写从mmc_queue_thread()的获取queue里面的request开始. 先列出调用栈,看下大概的调用顺序, 下面的内容主要阐述这些函数如何工作. host->op ...

  6. FZU2150 Fire Game —— BFS

    题目链接:https://vjudge.net/problem/FZU-2150 Problem 2150 Fire Game Accept: 2702    Submit: 9240 Time Li ...

  7. js程序开发-1

    <h1>数组的常用操作</h1> push() 方法可向数组的末尾添加一个或多个元素,并返回新数组的长度. unshift() 方法可向数组的开头添加一个或更多元素,并返回新数 ...

  8. CentOS7 安装和配置Tomcat

    1.官网下载Tomcat的压缩包 https://tomcat.apache.org/download-70.cgi 2.使用Xftp5把下载的压缩包上传到 /usr/soft (soft文件夹自己新 ...

  9. 合并table中某一列相邻的相同的行

    合并table中某一列相邻的相同的行​1. [代码]合并table中某一列相邻的相同的行  <!DOCTYPE html><html>    <head>      ...

  10. 并不对劲的bzoj3994:loj2185:p3327[SDOI2015]约数个数和

    题目大意 设d(x)为x的约数个数,\(t\)组询问,给定\(n,m\)(\(t,m,n\leq5*10^4\)),求$ \sum^n_{i=1}\sum^m_{j=1}d(i*j)$ 题解 假设\( ...