uva 11491——Erasing and Winning

太过爱你忘了你带给我的痛 2022-08-09 16:36 196阅读 0赞

题意:给定一个n位的整数,要求从中去掉k位,使得剩下的数字最大。

思路:单调队列。在满足删除的数等于k 的前提下求一个不敌减的序列。

code:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <algorithm>
  5. #include <cstring>
  6. #include <sstream>
  7. #include <string>
  8. #include <vector>
  9. #include <list>
  10. #include <queue>
  11. #include <stack>
  12. #include <map>
  13. #include <set>
  14. #include <bitset>
  15. using namespace std;
  16. typedef long long ll;
  17. typedef unsigned long long ull;
  18. typedef long double ld;
  19. const int INF=0x3fffffff;
  20. const int inf=-INF;
  21. const int N=100005;
  22. const int M=2005;
  23. const int mod=1000000007;
  24. const double pi=acos(-1.0);
  25. #define cls(x,c) memset(x,c,sizeof(x))
  26. #define cpy(x,a) memcpy(x,a,sizeof(a))
  27. #define fr(i,s,n) for (int i=s;i<=n;i++)
  28. #define lson l,m,rt<<1
  29. #define rson m+1,r,rt<<1|1
  30. #define lrt rt<<1
  31. #define rrt rt<<1|1
  32. #define middle int m=(r+l)>>1
  33. #define lowbit(x) (x&-x)
  34. #define pii pair<int,int>
  35. #define mk make_pair
  36. #define IN freopen("in.txt","r",stdin);
  37. #define OUT freopen("out.txt","w",stdout);
  38. int s[N];
  39. int main()
  40. {
  41. int n,k,x;
  42. while (~scanf("%d %d",&n,&k)&&n&&k)
  43. {
  44. k=n-k;
  45. int len=0;
  46. fr(i,0,n-1)
  47. {
  48. scanf("%1d",&x);//cout<<"bug"<<endl; //每次输入一位
  49. while (len&&n-i+len>k&&x>s[len-1]) len--; //假如还没选够k个并且当前较大,就弹出前面所选的数。其实是一个不递减的序列。
  50. if (len<k) s[len++]=x;
  51. } //cout<<len<<endl;
  52. fr(i,0,len-1) printf("%d",s[i]);
  53. puts("");
  54. }
  55. }

发表评论

表情:
评论列表 (有 0 条评论,196人围观)

还没有评论,来说两句吧...

相关阅读

    相关 uva10635Prince and Princess(LIS)

    题意:求最长相同公共子序列。 分析:《训练指南》P66,本题是一道经典的题目,巧妙的将LCS问题转化为LIS问题。这种题目的一个特定就是其中一个序列的所有元素均不相同。