美文网首页
P1106 删数问题

P1106 删数问题

作者: Plutorres | 来源:发表于2021-06-13 15:02 被阅读0次

P1106 删数问题
这题用双端队列做才是首选,贪心的思路很好理解,我们只有 k 次删除机会,每次删除都应该让前面的数尽可能地小,因为前面是高位,权重更高。

所以可以这样处理,维护一个单调不减的双端队列,遍历数组,若队列不为空且当前数小于队尾,而且有删除次数,则消耗一次删除次数弹出队尾(因为有了更小的选择),最后将当前数加到队尾。

遍历完成后可能会出现还有删除次数的情况(数组本身趋向于单调不减,遍历过程中很少满足弹出队尾的条件),这时进行相应次数的弹出队尾操作即可。

最后就是去除前导 0 和输出,下面列出的是本题的数据强化版U83355 删数问题【升级版】的AC代码,这个版本卡掉了 O(n^2) 的算法,我所知的可行的做法就是 O(nlogn)ST 表和本题解的 O(n)的做法。

#include <cstdio>
#include <cstring>
#include <deque>

using namespace std;

const int N = 5e5 + 5;
char a[N];
int n, k;

void solve() {
    scanf("%s%d", a, &k);
    n = strlen(a);
    
    deque<char> dq;
    for (int i = 0; i < n; i++) {
        while (!dq.empty() && a[i] < dq.back() && k) {
            dq.pop_back();
            k--;
        }
        dq.emplace_back(a[i]);
    }
    
    while (k--) dq.pop_back();
    while (!dq.empty() && dq.front() == '0') dq.pop_front();    // 去除前导 0
    
    if (dq.empty()) putchar('0');
    while (!dq.empty()) {
        putchar(dq.front());
        dq.pop_front();
    }
    putchar('\n');
}

int main() {
    int t; scanf("%d", &t);
    while (t--) solve();
    return 0;
}

相关文章

  • P1106 删数问题

    P1106 删数问题[https://www.luogu.com.cn/problem/U83355]这题用双端队...

  • 贪心算法删数问题

    删数问题 给定n位正整数a,去掉其中任意k个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n和k,设...

  • 2020-09-03 删数问题

    https://www.luogu.com.cn/problem/P1106

  • 我呀,真是个可爱之人

    文/小央 删过不计其数的说说,删过不计其数的微博,也删过好几个不喜欢的人,怎么办呢,我就是如此任性可爱。 ...

  • 每隔2个数删除一个数的删数问题

    问题:有一个数组a[N]顺序存放0~N-1,要求每隔两个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉...

  • MySQL语句小结(二)

    近期接触到一些mysql问题,最大连接数更改,进程监控,定时删sleep进程等 遇到_mysql_exceptio...

  • 关于极简(性冷淡风)

    我从来都是一个容易情绪化的人 而且一情绪化不干什么 就只是删删删 qq列表一百多人删到一位数 微信好友个位数 各种...

  • 你的手机经常内存不足吗?试试这个会有意想不到的效果

    手机经常显示没有储存空间,明明已经尽量的删除软件还是没有解决问题?今天我就来教大家怎么解决这个问题。 删删删...

  • 删,删,删

    一直喜欢极简的生活,才会忍不住删掉不曾联系的人,有时候也怀疑自己有病。 也有人问我为什么删他,也许就是喜欢删吧。有...

  • 删删删

    每次一有想不通的事情的时候,我就会按下删除键,一遍又一遍的循环着同一个操作。清空删除,再也没有什么可以删的时候,也...

网友评论

      本文标题:P1106 删数问题

      本文链接:https://www.haomeiwen.com/subject/whpssltx.html