标签:
Description
Input
Output
Sample Input
178543 4 1000001 1 100001 2 12345 2 54321 2
Sample Output
13 1 0 123 321
既然要删去m个数之后要求的数最小。那么肯定保留n-m个数字。那么每次在区间[i,i+m]查询最小值即可。
但是有个坑点,虽然这道题没有,但是底下的那道有,就是比较的时候,如果值相等,要选位置靠前的。
这也是贪心的思想。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<string>
#include<iostream>
#include<queue>
#include<cmath>
#include<map>
#include<stack>
#include<bitset>
using namespace std;
#define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i )
#define REP( i , n ) for ( int i = 0 ; i < n ; ++ i )
#define CLEAR( a , x ) memset ( a , x , sizeof a )
typedef long long LL;
typedef pair<int,int>pil;
const int INF = 0x3f3f3f3f;
const int maxn=1100;
int dp[maxn][20];
int num[maxn];
char str[maxn],ans[maxn];
int n,m;
int MIN(int a,int b)
{
    if(num[a]<=num[b]) return a;
    return b;
}
void init()
{
    for(int i=1;i<=n;i++)
        dp[i][0]=i;
    for(int j=1;(1<<j)<=n;j++)
        for(int i=1;i+(1<<j)-1<=n;i++)
            dp[i][j]=MIN(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
int RMQ(int l,int r)
{
    int k=(int)(log(r-l+1)/log(2.0));
    return MIN(dp[l][k],dp[r-(1<<k)+1][k]);
}
int main()
{
    while(~scanf("%s%d",str+1,&m))
    {
        n=strlen(str+1);
        REPF(i,1,n)
            num[i]=str[i]-'0';
        init();CLEAR(ans,0);
        int l=1,r=1+m;
        int cnt=0,pos;
        while(cnt<n-m)
        {
            pos=RMQ(l,r);
            ans[cnt++]=str[pos];
            l=pos+1;
            r++;
        }
        int i;
        for(i=0;i<cnt;i++)
            if(ans[i]!='0') break;
        if(i==cnt)
        {
            puts("0");
            continue;
        }
        for(;i<cnt;i++)
            printf("%c",ans[i]);
        puts("");
    }
    return 0;
}
在给定的n个数字的数字串中,删除其中k(k< n)个数字后,剩下的数字按原次序组成一个新的正整数。请确定删除方案,使得剩下的数字组成的新正整数最大。
输入一个由n个数字组成的正整数(1< n<=100000),再输入一个整数k(0<=k<n),表示要删除k位数字。 < n),输入的数字保证没有前导0。<n<=100000),再输入一个整数k(0<=k<n),表示要删除k位数字。
输出删除k位后的最大整数
102 1
12
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<string>
#include<iostream>
#include<queue>
#include<cmath>
#include<map>
#include<stack>
#include<bitset>
using namespace std;
#define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i )
#define REP( i , n ) for ( int i = 0 ; i < n ; ++ i )
#define CLEAR( a , x ) memset ( a , x , sizeof a )
typedef long long LL;
typedef pair<int,int>pil;
const int INF = 0x3f3f3f3f;
const int maxn=1e5+10;
int dp[maxn][20];
int num[maxn];
char str[maxn],ans[maxn];
int n,m;
int MAX(int a,int b)
{
    if(num[a]>=num[b]) return a;
    return b;
}
void init()
{
    for(int i=1;i<=n;i++)
        dp[i][0]=i;
    for(int j=1;(1<<j)<=n;j++)
        for(int i=1;i+(1<<j)-1<=n;i++)
            dp[i][j]=MAX(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
int RMQ(int l,int r)
{
    int k=(int)(log(r-l+1)/log(2.0));
    return MAX(dp[l][k],dp[r-(1<<k)+1][k]);
}
int main()
{
    while(~scanf("%s%d",str+1,&m))
    {
        n=strlen(str+1);
        REPF(i,1,n)
            num[i]=str[i]-'0';
        init();CLEAR(ans,0);
        int l=1,r=1+m;
        int cnt=0,pos;
        while(cnt<n-m)
        {
            pos=RMQ(l,r);
            ans[cnt++]=str[pos];
            l=pos+1;
            r++;
        }
        int i;
        for(i=0;i<cnt;i++)
            if(ans[i]!='0') break;
        if(i==cnt)
        {
            puts("0");
            continue;
        }
        for(;i<cnt;i++)
            printf("%c",ans[i]);
        puts("");
    }
    return 0;
}
标签:
原文地址:http://blog.csdn.net/u013582254/article/details/45199389