주어진 숫자 N은 가능한 최대 숫자를 얻기 위해 K 자리를 제거합니다.

LearningMath

제목에서 알 수 있듯이 작업은 다음과 같습니다.

주어진 숫자 NK가능한 최대 숫자를 얻기 위해 숫자를 제거 합니다. 숫자는 해당 위치에 남아 있어야합니다.

예 : n = 12345, k = 3, max = 45(처음 세 자리 숫자 제거하고 다른 위치로 이동해서는 안된다).

이 문제를 해결하는 방법을 아십니까?
(숙제가 아니라 알고리즘 콘테스트를 준비하고 온라인 심사 위원의 문제를 해결하고 있습니다.)

1 <= N <= 2^60, 1 <= K <= 20.

편집 : 여기 내 해결책이 있습니다. 작동 중입니다 :)

#include <iostream>
#include <string>
#include <queue>
#include <vector>
#include <iomanip>
#include <algorithm>
#include <cmath>

using namespace std;


int main()
{
    string n;
    int k;

    cin >> n >> k;

    int b = n.size() - k - 1;
    int c = n.size() - b;
    int ind = 0;
    vector<char> res;
    char max = n.at(0);

    for (int i=0; i<n.size() && res.size() < n.size()-k; i++) {
        max = n.at(i);
        ind = i;
        for (int j=i; j<i+c; j++) {
            if (n.at(j) > max) {
                max = n.at(j);
                ind = j;
            }
        }

        b--;
        c = n.size() - 1 - ind - b;
        res.push_back(max);
        i = ind;
    }

for (int i=0; i<res.size(); i++)
    cout << res.at(i);

cout << endl;

    return 0;
}
IVlad

무차별 대입은 제한에 대해 충분히 빨라야합니다 . n최대 19자릿수 를 갖습니다 . numDigits(n)비트가있는 모든 양의 정수를 생성합니다 . k비트가 설정된 경우 설정된 비트에 해당하는 위치에서 숫자를 제거합니다. 결과를 글로벌 최적과 비교하고 필요한 경우 업데이트하십시오.

복잡성 : O(2^log n * log n). 이것은 O(n)점근 적 으로 많이 그리고 똑같은 것처럼 보일 수 있지만 실제로는 훨씬 더 빠를 것입니다. 왜냐하면 로그 인 O(2^log n * log n)은 밑이 10 인 로그 이기 때문에 훨씬 더 작은 값 log base 10n제공 할 것 입니다 (1 + of 는 자릿수를 나타냅니다. / n).

한 번 log nn취한 조합 을 생성하고 각 조합을 생성 할 n - k때 선택한 n - k위치로 구성된 수를 구축 하여 요인을 피할 수 있습니다 (매개 변수로 전달). 이것은 기본적으로 비슷한 문제를 해결한다는 것을 의미합니다. given n, pick n - k digits in order such that the resulting number is maximum).

참고 : 무차별 대입을 포함하지 않는이 문제를 해결하는 방법이 있지만 주석에서 무차별 대입이 될 수있는 방법을 물었 기 때문에이 솔루션을 OP에도 보여주고 싶었습니다. 최적의 방법을 위해 왼쪽에서 오른쪽으로 숫자로 숫자를 만들면 어떤 일이 발생할지 조사하고 각 숫자 d에 대해 현재 선택된 숫자보다 작은 모든 숫자를 제거합니다. 언제 제거 할 수 있고 제거 할 수 없습니까?

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

주어진 한도 내에서 최대 합계를 얻기 위해 숫자 목록을 결합합니다.

분류에서Dev

주어진 숫자에 대해 두 숫자의 가능한 모든 조합 / 분할 찾기

분류에서Dev

정확한 주어진 숫자를 다른 순서로 포함하는 숫자를 찾기 위해 정규식을 만드는 방법은 무엇입니까?

분류에서Dev

주어진 숫자 k를 제외하고 효율적으로 n 개의 숫자 배열 만들기

분류에서Dev

주어진 합계 'k'를 생성하는 고유 숫자 개수 최대화

분류에서Dev

SQL Server에서 주어진 14 자리 숫자에 대한 마지막 숫자 (15 번째 luhn 검사 숫자)를 얻으려면 어떻게해야합니까?

분류에서Dev

숫자의 가장 높은 자리를 찾기 위해 재귀 함수를 어떻게 생성합니까?

분류에서Dev

x 거리에서 주어진 숫자에 가장 가까운 n 개의 숫자를 찾으려면 어떻게해야합니까?

분류에서Dev

주어진 합계에 도달하기 위해 주어진 숫자의 가능한 모든 조합을 가져옵니다.

분류에서Dev

함수의 인수로 주어진 4 개의 숫자에 대해 모든 숫자에 대해 결합 된 최대 주파수를 가진 숫자를 찾아야합니까?

분류에서Dev

숫자 대 숫자를 나타내는 문자를 출력하기 위해 LARGE를 얻으려고합니다.

분류에서Dev

주어진 숫자 주변의 숫자 범위 얻기

분류에서Dev

주어진 범위에서 숫자의 최대 계수 합계

분류에서Dev

절대 값을 계산하기 위해 문자열에 주어진 숫자를 사용하는 방법은 무엇입니까?

분류에서Dev

주어진 값보다 더 높은 숫자를 얻는 방법

분류에서Dev

문자열과 다음 문자를 찾기위한 정규식은 숫자가 아니어야합니다.

분류에서Dev

합이 주어진 정수 k와 같지 않아야하는 1에서 n 숫자의 최대 합

분류에서Dev

목표 숫자를 얻기 위해 숫자 추가

분류에서Dev

주어진 숫자를 만드는 데 필요한 최소 자릿수 찾기

분류에서Dev

n 개의 숫자와 k 개의 슬롯이 주어집니다. 각 슬롯에 대해 0이거나 이전 숫자 인 Combinatorics보다 작은 숫자가 될 수 있습니다.

분류에서Dev

1 바이트 부동 소수점에 대한 무한대를 얻기 위해 추가해야하는 최소 숫자는 얼마입니까?

분류에서Dev

최대 4 개의 숫자를 찾기위한 사용자 정의 기능

분류에서Dev

평균, 최대 및 최소에 도달하기 위해 초 단위로 큰 숫자를 얻을 때 datetime 형식으로 어떻게 변환합니까?

분류에서Dev

사용할 주어진 숫자와 범위를 더한 모든 숫자를 찾습니다.

분류에서Dev

일련의 숫자에서 가장 큰 숫자와 가장 작은 숫자를 올바르게 얻으려면 어떻게해야합니까?

분류에서Dev

완벽한 숫자를 찾는 프로그램 : 출력 오류. 완전 수는 인자의 합이 주어진 숫자와 같은 숫자입니다.

분류에서Dev

쿼리는 각 행에 대해 가장 높은 숫자를 반환합니다.

분류에서Dev

목록의 요소의 합이 주어진 숫자를 제공하도록 가능한 모든 조합의 2 자리 숫자로 목록을 무작위로 채 웁니다.

분류에서Dev

주어진 숫자 n에 대해 n 제곱까지 매직 매트릭스를 인쇄하는 방법

Related 관련 기사

  1. 1

    주어진 한도 내에서 최대 합계를 얻기 위해 숫자 목록을 결합합니다.

  2. 2

    주어진 숫자에 대해 두 숫자의 가능한 모든 조합 / 분할 찾기

  3. 3

    정확한 주어진 숫자를 다른 순서로 포함하는 숫자를 찾기 위해 정규식을 만드는 방법은 무엇입니까?

  4. 4

    주어진 숫자 k를 제외하고 효율적으로 n 개의 숫자 배열 만들기

  5. 5

    주어진 합계 'k'를 생성하는 고유 숫자 개수 최대화

  6. 6

    SQL Server에서 주어진 14 자리 숫자에 대한 마지막 숫자 (15 번째 luhn 검사 숫자)를 얻으려면 어떻게해야합니까?

  7. 7

    숫자의 가장 높은 자리를 찾기 위해 재귀 함수를 어떻게 생성합니까?

  8. 8

    x 거리에서 주어진 숫자에 가장 가까운 n 개의 숫자를 찾으려면 어떻게해야합니까?

  9. 9

    주어진 합계에 도달하기 위해 주어진 숫자의 가능한 모든 조합을 가져옵니다.

  10. 10

    함수의 인수로 주어진 4 개의 숫자에 대해 모든 숫자에 대해 결합 된 최대 주파수를 가진 숫자를 찾아야합니까?

  11. 11

    숫자 대 숫자를 나타내는 문자를 출력하기 위해 LARGE를 얻으려고합니다.

  12. 12

    주어진 숫자 주변의 숫자 범위 얻기

  13. 13

    주어진 범위에서 숫자의 최대 계수 합계

  14. 14

    절대 값을 계산하기 위해 문자열에 주어진 숫자를 사용하는 방법은 무엇입니까?

  15. 15

    주어진 값보다 더 높은 숫자를 얻는 방법

  16. 16

    문자열과 다음 문자를 찾기위한 정규식은 숫자가 아니어야합니다.

  17. 17

    합이 주어진 정수 k와 같지 않아야하는 1에서 n 숫자의 최대 합

  18. 18

    목표 숫자를 얻기 위해 숫자 추가

  19. 19

    주어진 숫자를 만드는 데 필요한 최소 자릿수 찾기

  20. 20

    n 개의 숫자와 k 개의 슬롯이 주어집니다. 각 슬롯에 대해 0이거나 이전 숫자 인 Combinatorics보다 작은 숫자가 될 수 있습니다.

  21. 21

    1 바이트 부동 소수점에 대한 무한대를 얻기 위해 추가해야하는 최소 숫자는 얼마입니까?

  22. 22

    최대 4 개의 숫자를 찾기위한 사용자 정의 기능

  23. 23

    평균, 최대 및 최소에 도달하기 위해 초 단위로 큰 숫자를 얻을 때 datetime 형식으로 어떻게 변환합니까?

  24. 24

    사용할 주어진 숫자와 범위를 더한 모든 숫자를 찾습니다.

  25. 25

    일련의 숫자에서 가장 큰 숫자와 가장 작은 숫자를 올바르게 얻으려면 어떻게해야합니까?

  26. 26

    완벽한 숫자를 찾는 프로그램 : 출력 오류. 완전 수는 인자의 합이 주어진 숫자와 같은 숫자입니다.

  27. 27

    쿼리는 각 행에 대해 가장 높은 숫자를 반환합니다.

  28. 28

    목록의 요소의 합이 주어진 숫자를 제공하도록 가능한 모든 조합의 2 자리 숫자로 목록을 무작위로 채 웁니다.

  29. 29

    주어진 숫자 n에 대해 n 제곱까지 매직 매트릭스를 인쇄하는 방법

뜨겁다태그

보관