zoukankan      html  css  js  c++  java
  • UVA-11491 Erasing and Winning

    n位整数,求删除k位,可以得到的最大值。

    n和k都是10^5。

    首先可以想到的是从前面开始,如果看到一位比后面的小,那么就要删除。

    这样看貌似是O(n)的。

    但是有反例:42635 删除2位

    那么需要删的是4 和 2 答案是635

    所以又想到删k次,每次都从第一位开始找。这样是O(nk)的,显然T了。

    加个优化,上一次删除的是第 i 位,那么找过的前 i - 1 位都不用看了。所以是近似是O(n)的。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define maxn 100000 + 100
    using namespace std;
    
    
    int main()
    {
        int n, k;
        while (cin >> n >> k && n)
        {
            char s[maxn];
            scanf("%s", s);
            int ans = 0, last = 0; //last记录下一次应该开始的位置
            for (int j = 1; j <= k; j++)
            {
                for (int i = last; i <= n-1; i++)
                if (i >= 0 && s[i] > 0)
                {
                    int id = i+1;
                    while(s[id] == -1) id++;
                    if (s[i] < s[id])
                    {
                        s[i] = -1;
                        int k = i-1;
                        while(s[k] == -1) k--; //找前一位没被删的数字
                        last = k;
                        ans++;
                        break;
                    }
                }
            }
            k -= ans;
    
            if (k)
                for (int i = n-1; k && i >= 0; i--,k--) s[i] = -1;
    
            for (int i = 0; i < n; i++)
                if (s[i] != -1) cout << s[i];
            cout << endl;
        }
    }
    


  • 相关阅读:
    vue框架的vue-router路由的运用
    如何用vue的computed的set和get方法
    如何学习vue的计算属性computed
    从下往上显示的弹出框动画
    vue父传子的使用
    vue局部组件如何使用
    Data 日期-项目(Thread)
    Jframe-项目
    Thread 线程
    Thread知识 (火车票到结束-项目)
  • 原文地址:https://www.cnblogs.com/ruthank/p/8712056.html
Copyright © 2011-2022 走看看