qdu oj 76 映射游戏

本文介绍了一种通过快速排序解决特定映射问题的方法,旨在寻找一组字符串在字符到数字映射下的最大整数和。文章详细展示了如何通过计算每个字符的权重并使用快速排序来确定最优的映射方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<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;
	
	
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值