アルゴリズム::白駿::Breutforce,グリンディ::1339:単語数学
16197 ワード
1.問題の分析
1.1. 問題の意図.
2.問題解決
1.Breutforceメソッド
Q
またはZ
などのアルファベットも表示されます.注意!next_permutation()
関数を使用してすべての組合せの和を計算します2.Greedyメソッド
GAFA
= alpha[‘G’ - ‘A’] = 1000
, alpha[‘A’ - ‘A’] = 100
, alpha[‘A’ - ‘F’] = 10
, alpha[‘A’ - ‘A’] = 101
alpha
昇順に並べます.alpha
アレイは、末尾から9、8、および7を乗じる.GCF
+ ACDEB
alpha[0]
) = 10,000B(
alpha[1]
) = 1C(
alpha[2]
) = 1,010D(
alpha[3]
) = 100E(
alpha[4]
) = 10F(
alpha[5]
) = 1G(
alpha[6]
) = 100 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 10 100 100 1010 10000
3.コード
1.Breutforceメソッド
#include <iostream>
#include <algorithm>
using namespace std;
int N, alpha[26], mappingTable[10], answer;
char words[10][9];
int cvt2Num(char str[9]) {
int ret = 0, idx = 0;
while (str[idx] != '\0') ret = ret * 10 + mappingTable[alpha[str[idx++] - 'A']];
return ret;
}
int main() {
ios::sync_with_stdio(false), cin.tie(NULL);
cin >> N;
// alpha와 mappingTable 배열 초기화
for (int i = 0; i < 26; ++i) alpha[i] = -1;
for (int i = 0; i < 10; ++i) mappingTable[i] = i;
// 단어 입력받기.
for (int i = 0, k = 0; i < N; ++i) {
int j = 0;
cin >> words[i];
// words[i] 속 알파벳이 mappingTable의 k번째 인덱스에 매핑.
while(words[i][j] != '\0') {
if (alpha[words[i][j] - 'A'] == -1) alpha[words[i][j] - 'A'] = k++;
j++;
}
}
do {
int sum = 0;
for (int i = 0; i < N; ++i) sum += cvt2Num(words[i]);
answer = max(answer, sum);
} while(next_permutation(mappingTable, mappingTable + 10));
cout << answer;
}
2.Greedyメソッド
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int N, len, ans, alphabet[26];
int main() {
char str[9];
scanf("%d", &N);
while (N--) {
scanf("%s", str);
len = strlen(str);
// 모든 단어 속에서 특정 알파벳이 위치했던 자릿수를 더한다.
for (int i = len - 1, j = 1; i >= 0; --i, j *= 10)
alphabet[str[i] - 'A'] += j;
}
sort(alphabet, alphabet + 26);
for (int i = 0; i < 10; ++i) ans += alphabet[25 - i] * (9 - i);
printf("%d", ans);
}
4.結果
1.Breutforceメソッド
2.Greedyメソッド
Reference
この問題について(アルゴリズム::白駿::Breutforce,グリンディ::1339:単語数学), 我々は、より多くの情報をここで見つけました
https://velog.io/@embeddedjune/알고리즘-백준-Bruteforce-그리디-1339-단어-수학
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
#include <iostream>
#include <algorithm>
using namespace std;
int N, alpha[26], mappingTable[10], answer;
char words[10][9];
int cvt2Num(char str[9]) {
int ret = 0, idx = 0;
while (str[idx] != '\0') ret = ret * 10 + mappingTable[alpha[str[idx++] - 'A']];
return ret;
}
int main() {
ios::sync_with_stdio(false), cin.tie(NULL);
cin >> N;
// alpha와 mappingTable 배열 초기화
for (int i = 0; i < 26; ++i) alpha[i] = -1;
for (int i = 0; i < 10; ++i) mappingTable[i] = i;
// 단어 입력받기.
for (int i = 0, k = 0; i < N; ++i) {
int j = 0;
cin >> words[i];
// words[i] 속 알파벳이 mappingTable의 k번째 인덱스에 매핑.
while(words[i][j] != '\0') {
if (alpha[words[i][j] - 'A'] == -1) alpha[words[i][j] - 'A'] = k++;
j++;
}
}
do {
int sum = 0;
for (int i = 0; i < N; ++i) sum += cvt2Num(words[i]);
answer = max(answer, sum);
} while(next_permutation(mappingTable, mappingTable + 10));
cout << answer;
}
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int N, len, ans, alphabet[26];
int main() {
char str[9];
scanf("%d", &N);
while (N--) {
scanf("%s", str);
len = strlen(str);
// 모든 단어 속에서 특정 알파벳이 위치했던 자릿수를 더한다.
for (int i = len - 1, j = 1; i >= 0; --i, j *= 10)
alphabet[str[i] - 'A'] += j;
}
sort(alphabet, alphabet + 26);
for (int i = 0; i < 10; ++i) ans += alphabet[25 - i] * (9 - i);
printf("%d", ans);
}
1.Breutforceメソッド
2.Greedyメソッド
Reference
この問題について(アルゴリズム::白駿::Breutforce,グリンディ::1339:単語数学), 我々は、より多くの情報をここで見つけました https://velog.io/@embeddedjune/알고리즘-백준-Bruteforce-그리디-1339-단어-수학テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol