zoukankan      html  css  js  c++  java
  • 【uva 11491】Erasing and Winning(算法效率--贪心+单调队列)

    题意:有一个N位整数,要求输出删除其中D个数字之后的最大整数。

    解法:贪心。(P.S.要小心,我WA了2次...)由于规定了整数的位数,那么我们要尽量让高位的数字大一些,也就是要尽量删去前面小的数字。于是我们得到的数字前面是有一串下降的单调队列的,所以最开始就要维护这个。但是要注意——我们不是立马得到了这 n-d 位的整数,而是经过维护单调队列调整后的。因此我下面代码的那句break出循环是错的。

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<iostream>
     4 using namespace std;
     5 
     6 const int N=(int)1e5+10;
     7 int a[N];
     8 
     9 int main()
    10 {
    11     while (1)
    12     {
    13       int n,d;
    14       scanf("%d%d",&n,&d);
    15       if (!n&&!d) break;
    16       char c=getchar();
    17       int t,cnt;
    18       t=0;
    19       while (c<'0'||c>'9') c=getchar();
    20       while (c>='0'&&c<='9') a[++t]=c-'0', c=getchar();
    21       t=1, cnt=0;
    22       for (int i=2;i<=n;i++)
    23       {
    24         while (a[i]>a[t] && t>0 && cnt<d) t--,cnt++;
    25         //if (t==n-d) break;//删d个,不能直接把后面的删了
    26         a[++t]=a[i];
    27       }
    28       for (int i=1;i<=n-d;i++) printf("%d",a[i]);
    29       printf("
    ");
    30     }
    31     return 0;
    32 }
  • 相关阅读:
    利用Jmeter模拟Github登录
    利用Python模拟GitHub登录
    Linux命令学习-ps命令
    Linux命令学习-tail命令
    Linux命令学习-history命令
    Linux命令学习-wget命令
    Linux命令学习-tar命令
    10.21工作第11天
    10.18工作第十天
    10.17工作第九天
  • 原文地址:https://www.cnblogs.com/konjak/p/6050927.html
Copyright © 2011-2022 走看看