问题 C: 删数问题

 

题目描述

      输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序组成一个新的正整数。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小。

       输出新的正整数。(N不超过240位)输入数据均不需判错。

输入

n

s

输出

最后剩下的最小数。

样例输入

175438
 4

样例输出

13
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
    int s;
    string n,n1;
    cin>>n>>s;
    int ln=n.length();
    string::iterator it=n.begin();
    while(s)
    {
        int i=0;
        while(i<ln&&n[i]<=n[i+1])
        {
            i++;
        }
        s--;
        n.erase(it+i);   
    }
    int k=0;
    bool pd=false;
    for(int i=0;i<n.length();i++)
    {
        if(n[i]!='0')
            pd=true;
        if(n[i]!='0'||pd)
            {cout<<n[i];
            k++;
            }    
    }
    if(k==0)
    cout<<"0";
    return 0;
}

 

在C语言中,求问题通常是指给定一个整组,需要找出经过最少次操作(每次可以将任意一位字变为0),使得剩下的所有字都是唯一的。这个问题可以用哈希集合(如`unordered_set`)来解决,同时记录每个字变成唯一所需的除次。 下面是一个简单的步骤来实现这个功能: 1. 首先,创建一个哈希集合来存储已经遇到的字,并初始化一个变量`minDeletions`来保存最低除次,以及`result`来存储最终的新。 2. 对于组中的每一个元素,检查它是否已经在哈希集中。如果不在,添加到集合并更新`minDeletions`为0;如果已在集合中,则计算当前元素变成唯一所需的额外除次,并更新`minDeletions`。 3. 同时,遍历每一位,如果该位对应的字不是唯一的,递增除次。 4. 更新`result`为当前的,表示经过最少除后的结果。 5. 循环结束后,`result`即为最小的新,`minDeletions`即为总的除位。 下面是一个简化的伪代码示例: ```c #include <stdio.h> #include <stdbool.h> #include <unordered_set> int delete_min(int num[], int size) { std::unordered_set<int> unique; int minDeletions = 0, result = 0; for (int i = 0; i < size; ++i) { if (unique.find(num[i]) == unique.end()) { unique.insert(num[i]); minDeletions = 0; } else { minDeletions += __builtin_popcount(num[i]); // 使用__builtin_popcount计算非零位 } result |= num[i]; // OR操作合并字 } return minDeletions + __builtin_popcount(result); } int main() { int nums[] = {1, 2, 2, 3, 4, 4, 4, 5, 6}; int size = sizeof(nums) / sizeof(nums[0]); int deletions = delete_min(nums, size); printf("最小新: %d\n", deletions); printf("除位: %d\n", deletions); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值