当前位置:   article > 正文

最小新整数 YTU 3646 贪心算法

最小新整数 YTU 3646 贪心算法

题目描述

给定一个十进制正整数 n (0<n<10000000000),每个数位上数字均不为 0。n 的位数为m。

现在从 m 位中删除 k 位 (0<k<m),求生成的新整数最小为多少?

例如: n=9128456,k=2, 则生成的新整数最小为12456。

输入

第一行 T, 表示有 T 组数据。

接下来 T 行,每一行表示一组测试数据,每组测试数据包含两个数字 n,k。

输出

T 行,每行一个数字,表示从 n 中删除 k 位后得到的最小整数。

输入输出样例

样例输入 #1

复制

  1. 2
  2. 9128456 2
  3. 1444 3
样例输出 #1

复制

  1. 12456
  2. 1

思路:

这道题一定不要有一种错误的认知就是,只要每次都删掉最大的那个数,这就是最优解,

其实不然,比如数字1243865,如果删掉8得到的数字是124365,如果删掉 4,得到的是123865,

显然删掉4比删掉8得到的数字还要小。
通过分析可知删数的规律
1.删掉自左至右,第一个大于它右面数的数字
2.如果是自然序的话,删掉最右面的数字
 

代码实现:

  1. #include<iostream>
  2. #include<cstring>
  3. #include<string>
  4. #include<algorithm>
  5. using namespace std;
  6. string n;
  7. int k;
  8. void solve()
  9. {
  10. cin>>n>>k;
  11. while(k--)
  12. {
  13. for(int i=0; i<n.size(); i++)
  14. {
  15. if(n[i]>n[i+1] || i==n.size()-1)
  16. {
  17. n.erase(i,1);
  18. break;
  19. }
  20. }
  21. }
  22. cout<<n<<endl;
  23. }
  24. int main()
  25. {
  26. int t;
  27. cin>>t;
  28. while(t--)
  29. {
  30. solve();
  31. }
  32. return 0;
  33. }


 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/599032
推荐阅读
相关标签
  

闽ICP备14008679号