1.有 n 个字符串,每个字符串都是由 A-J 的大写字符构成。现在你将每个字符映射为一个 0-9 的数字,不同字符映射为不同的数字。这样每个字符串就可以看做一个整数,唯一的要求是这些整数必须是正整数且它们的字符串不能有前导零。现在问你怎样映射字符才能使得这些字符串表示的整数之和最大?
我的答案只通过了20%,不过思路应该是对的,就是实现起来不容。
1.未考虑到首字母不能为0的情况
#include<bits/stdc++.h>
using namespace std;
long long LetterWeightDiv(string *str,int number,std::vector<long long> letter)
{
int slength=0;
int letternum=0;//第几个字母
int j=0,i=0;
long long sum=0;
for(i=0;i<number;i++)//统计每个字符串系数和
{
slength = str[i].size();
for(j=0;j<slength;j++)
{//还要考虑特殊情况,比如字符不在A-J范围内
if(str[i].at(j)>='A'&&str[i].at(j)<='J')
{
letternum = str[i].at(j) - 'A';
letter[letternum]+=pow(10,j);//注意pow数据类型
}
else
return 0;
}
}
sort(letter.begin(),letter.end());
for(j=9;letter[j]!=0;j--)
{
sum+=letter[j]*j;
}
return sum;
}
int main()
{
int number;
string stemp;
long long res;
std::vector<long long> letter(10);
cin>>number;
string *str=new string[number];
for(int i=0;i<number;i++)//接收字符串
{
cin>>stemp;
str[i]=stemp;
}
res=LetterWeightDiv(str,number,letter);
cout<<res;
return 0;
}
下为评论区的答案:
#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<algorithm>
#include<map>
using namespace std;
bool cmp(pair<char, long>a, pair<char, long>b){
return a.second > b.second;
}
int main(){
int n;
while(cin>>n){
map<char, long long>m;
set<char> f; //保存首字母
for(int i=0;i<n;i++){
string s;
cin>>s;
long long b = 1;
for(string::reverse_iterator i=s.rbegin();i<s.rend();i++){
m[*i] += b;
b *= 10;
}
f.insert(s[0]);
}
vector<pair<char, long long> >v(m.begin(), m.end());
sort(v.begin(), v.end(), cmp);
int i = v.size() - 1;
// 所有字母出现时,找到没有出现在首字母中权重最小的字母
while(v.size()==10 && i>=0 && f.find((v[i]).first)!=f.end()){
i--;
}
unsigned long long res = 0;
if(i!=(v.size()-1)){
// 最小字母赋值0,删除即可
v.erase(v.begin() + i);
}
int b = 9;
for(int i=0;i<v.size();i++){
res += b * v[i].second;
b--;
}
cout<<res<<endl;
}
return 0;
}