Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 한 문자의 모든 발생을 제거한 후 ASCII 값 합계 최소화

<시간/>

문자열이 있다고 가정합니다. 특정 문자의 모든 발생을 제거한 후 문자열에 대한 각 문자의 ASCII 값 합계를 최소화해야 합니다. 문자열이 "hello"와 같이 주어졌다고 가정하면 ASCII 문자의 합은 (104 + 101 + 108 + 108 + 111) =532입니다. 이제 각 문자의 발생을 확인하십시오.

  • h는 한 번 발생했으므로 비용은 1 * 104 =104입니다.
  • e는 한 번 발생했으므로 비용은 1 * 101 =101입니다.
  • 나는 한 번 발생했으므로 비용은 2 * 108 =216입니다.
  • o가 한 번 발생했으므로 비용은 1 * 111 =111입니다.

여기서 l은 최대 시간 동안 발생하므로 l의 모든 발생을 제거하면 값이 최소화됩니다. 그래서 실제로 우리는 위의 목록에서 최대값을 제거하고 있습니다. 여기서 최종 결과는 532 – 216 =316입니다.

논리는 처음에는 간단합니다. 문자열의 ASCII 합계를 가져와야 합니다. 그런 다음 문자열에 있는 각 문자의 빈도를 계산한 다음 최대값에 기여하는 해당 문자를 발생 * ASCII 값으로 제거합니다. 뺀 값이 결과입니다.

예시

#include <iostream>
using namespace std;
int minASCIISum(string str, int len) {
   int max_val = INT_MIN, sum = 0;
   int frequency[26] = { 0 };
   for (int i = 0; i < len; i++) {
      frequency[str[i] - 'a']++;
      sum += (int)str[i];
   }
   for (int i = 0; i < 26; i++)
   max_val = max(max_val, frequency[i] * (i + 'a'));
   return (sum - max_val);
}
int main() {
   string str = "hello";
   int n = str.length();
   cout << "Minimized Sum: " << minASCIISum(str, n);
}

출력

Minimized Sum: 316