<div>
</div>
映射游戏
发布时间: 2016年5月2日 21:03 最后更新: 2016年5月2日 21:05 时间限制: 1000ms 内存限制: 128M
现在给你 n 个字符串,每个字符串呢都是由A到J的大写字符组成的哈。
现在你需要将每个字符映射为一个 0-9 的数字,不同的字符映射为不同的数字。
这样每个字符串就可看做是一个整数了,当然有个小要求,这些整数必须是正整数且它们的字符串不能有前导零。
现在问你怎样映射字符才能使得这些字符串表示的整数之和最大。
多组测试数据。 每组数据第一行为一个正整数 n,接下来有 n 行,每行一个长度不超过 12 且仅包含大写字母 A-J 的字符串。 0< n <= 50,且至少存在一个字符不是任何字符串的首字母。
对于每组测试数据输出一行,这一行共有一个数,表示最大和是多少。
复制
2 ABC BCA
1875
此题归类 搜索,此次并没有用到搜索,只是简单的快排
思路:
ABC
BCA
每次输入记录权值,s=100A+10B+c+100B+10c+A=101A+110B+11c
快排=》110B+ 101A+11c => B=9,A=8,c=7;
ans=1875
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
char a[13];
int book[10];
struct node{
int a;
long long b;
}b[13],change;
long long t,ans;
bool cmp(node a,node b){
return a.b <b.b ;
}
int main(){
int n,i,j;
while(~scanf("%d",&n)){
getchar();
memset(b,0,sizeof(b));
memset(book,0,sizeof(book));
for(i=0;i<10;i++)
b[i].a=i;
for(i=1;i<=n;i++){
gets(a);
book[a[0]-'A']=1;
for(j=strlen(a)-1,t=1;j>=0;t*=10,j--){
b[a[j]-'A'].b+=t;
}
}
sort(b,b+10,cmp);
//for(i=0;i<10;i++)
// printf("\t%c%lld",b[i].a+'A',b[i].b );
if(book[b[0].a]==1){
for(i=1;book[b[i].a ]==1;i++)
;
change=b[i];
b[i]=b[0];
b[0]=change;
}
// printf("\n");
/// for(i=0;i<10;i++)
// printf("\t%c%lld",b[i].a+'A',b[i].b );
for(i=9,ans=0;b[i].b!=0&&i>=0;i--){
ans+=(i*b[i].b);
}
printf("%lld\n",ans);
}
return 0;
}