1231——最小新整数 信息学奥赛一本通 贪心算法

这段代码的目的是从一个十进制正整数 n 中删除 k 位数字,使得生成的新整数最小。具体步骤如下:

  1. 输入处理

    • 首先读取测试用例的数量 t。
    • 对于每个测试用例,读取整数 n 和需要删除的位数 k。
  2. 将整数转换为数组

    • 将整数 n 转换为字符串,然后将每个字符转换为整数并存入 vector<int> a 中。
  3. 删除数字以生成最小整数

    • 使用一个迭代器 it 遍历 vector<int> a。
    • 在遍历过程中,如果当前数字大于其后面的数字,则删除当前数字,并更新迭代器和 k 的值。
    • 如果当前数字不大于其后面的数字,则迭代器不动,实际操作是保证迭代器不失效,先向后移动一位再退回,如果已经是开头的则不退回。这样做是因为删除之后上一个数还要与后面的数字比较,所以迭代器不动。
    • 如果遍历到最后一个数字,或者 k 已经为 0,则停止遍历。
    • 如果 k 仍然大于 0,则从 vector<int> a 的末尾开始删除数字,直到 k 为 0。
  4. 输出结果

    • 将 vector<int> a 中的数字拼接成最终的最小整数,并输出。
      #include<bits/stdc++.h>
      using namespace std;
      
      int main(){
      int t;
      cin>>t;
      for(int i=1;i<=t;i++){
      string n;
      cin>>n;
      vector<int>a;
      for(char c:n){
          a.push_back(c-'0');
      }
      int k;
      cin>>k;
      auto it=a.begin();
      while(1){
          if(k==0)
          break;
          if(it==a.end()-1)
          break;
          if(*it>*(it+1)){
              it=a.erase(it);
              k--;
              if(it!=a.begin())
              it--;
          }
          else{
              it++;
          }
      }
      while(k!=0){
          a.pop_back();
          k--;
      }
      for(int c:a){
          cout<<c;
      }
      cout<<endl;
      }
          return 0;
      }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值