字母权值分配问题

发布时间:2017-5-1 5:02:06 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"字母权值分配问题",主要涉及到字母权值分配问题方面的内容,对于字母权值分配问题感兴趣的同学可以参考一下。

现有字母a-z(不分大小写),可以为这些字母分配1-26的权值。 给定两个字符串,由a-z组成,字符串的权值等于所有字符的权值相加,问怎么样分配权值,才能使两个字符串的差值最大。 #include<iostream> #include<string> using namespace std; const len=26; int main() { char *p1=new char[50]; char *p2=new char[50]; char *r=new char[60]; char *head=r; gets(p1); gets(p2); int n1[len]={0},n2[len]={0},d=0,key=0,f1=0,f2=1,res[26]={0}; //将p1,p2中每个字母出现的次数分别记录在n1和n2数组中。a-z对应下标0-25。包括将其中的大写字母转化为小写。 while(*p1!='\0') {if(*p1<'a') *p1+=32; n1[(*p1-'a')]++; p1++;} while(*p2!='\0') {if(*p2<'a') *p2+=32; n2[(*p2-'a')]++; p2++;} //for(int kk=0;kk<len;kk++) //cout<<n1[kk]<<' '; //将p1和p2中相同的字符抵消。 for(int i=0;i<len;i++) { d=((n1[i]<=n2[i]) ? n1[i]:n2[2]); n1[i]-=d; n2[i]-=d; } //对p1中的字符,按该字符出现的次数分配权值,次数最多的分配26,次多的分配25,依次递减。 d=0; while(1) { for(int i=0;i<len;i++) if(d<n1[i]) { d=n1[i]; key=i; } if(d==0) break; n1[key]=0; res[key]=len-f1; f1++; d=0; } //对p2中的字符,按该字符出现的次数分配权值,次数最多的分配1,次多的分配2,依次递增。 d=0; while(1) { for(int i=0;i<len;i++) if(d<n2[i]) { d=n2[i]; key=i; } if(d==0) break; n2[key]=0; res[key]=f2; f2++; d=0; } //将未分配的字符予以分配,并将结果存入字符串r中。 for(int j=0;j<len;j++) { if(res[j]==0) { res[j]=f2; f2++; } sprintf(r,"%c%d",'a'+j,res[j]); r+=strlen(r); } cout<<head; }

上一篇:Send a Table
下一篇:phone中重要的类

相关文章

相关评论

本站评论功能暂时取消,后续此功能例行通知。

一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!

二、互相尊重,对自己的言论和行为负责。

好贷网好贷款