최대 곱

문제 링크: https://www.acmicpc.net/problem/1500

 

1500번: 최대 곱

세준이는 정수 S와 K가 주어졌을 때, 합이 S인 K개의 양의 정수를 찾으려고 한다. 만약 여러개일 경우 그 곱을 가능한 최대로 하려고 한다. 가능한 최대의 곱을 출력한다. 만약 S=10, K=3이면, 3,3,4는

www.acmicpc.net

 

최대한 골고루 분배를 하여 곱해주는 것이 가장 효율적이다.
s = 10, k = 3일 때, 10을 3으로 나누었을 때, 3, 3, 3, 1이 된다.
우리는 3묶음으로 하면 되니, 나머지 1을 누군가에게 분배를 해주면 된다.
따라서, 3 3 4로 36이 된다.
만일 11을 3으로 나누게 된다면, 3, 3, 3, 2가 되며, 이 2또한 누군가에게 분배를 해준다.
3 4 4로 48이 된다.

이를 정리하면, 전체 k개에서 나머지만큼 분배할 mod수를 제외하고는 전부 s/k의 값을 곱해준다.
그 후 mod를 분배하여 추가한 (s/k+1)을 mod수 만큼 곱해준다.

 

  • 정답 코드

      #include<iostream>
      #include<cmath>
      using namespace std;
      unsigned long long int cal = 1;
      int s, k;
    
      int main() {
          cin >> s >> k;
          int mod = s % k;
          int div = s / k;
    
          cout << fixed;
          cout.precision(0);
          if (!mod)
              cout << pow(div, k);
    
          else {
    
              for (int i = 0; i < k-mod; i++) {
                  cal = (unsigned long long int)cal * div;
              }
              for (int i = 0; i < mod; i++) {
                  cal = (unsigned long long int)cal * (div+1);
              }
              cout << cal;
          }
          return 0;
      }

'ProblemSolving' 카테고리의 다른 글

[BOJ] 12865_평범한 배낭  (0) 2021.02.25
[BOJ] 2156_포도주 시식  (0) 2021.02.25
[BOJ] 1153_네 개의 소수  (0) 2021.02.23
[BOJ] 1912_연속합  (0) 2021.02.20
[BOJ] 3163_떨어지는 개미  (0) 2021.02.19
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기