字母A-J,用0-9对应字母使得n组数据和最大,输入字符串前面保证非0

如输入组数据:

2

ABC

BCA

输出:

1875

思路:其实就是求和,对应字符乘以相应的量级,按系数排序

如上MAX(101A+110B+11C)

那B:9 A:8,C:7产生最大和

同时考虑类型为字符串涉及字符串加法

#include <algorithm>
#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <math.h>
#define IMIN numeric_limits<int>::min()
#define IMAX numeric_limits<int>::max()
#define FR(i,n) for(int i=0;i<n;i++)
#define CLC(x) memset(x,0,sizeof(x))
#define FILL(x,c) memset(x,c,sizeof(x))
#define viter vector<int>::const_iterator
using namespace std;
string invert(string &src)
{
string newStr=src;
for(int i=src.length()-1,j=0; i>=0; --i,++j)
newStr[j]=src[i];
return newStr;
}
void inverse(string &s)
{
for(int i=0;i<s.size()/2;++i){
char tmp= s[i];
s[i] = s[s.size()-1-i];
s[s.size()-1-i] = tmp;
}
}
string intAdd(string &rs1,string &rs2)
{
string str1=invert(rs1);
string str2=invert(rs2);
if(str1.length()<str2.length())
str1.swap(str2); for(size_t i=0; i!=str2.length(); ++i)
{
char c1=str1[i];
char c2=str2[i];
int t=((int)c1-48)+((int)c2-48);
if(t>=10)
{
//进位
int x=t/10;
t%=10;
size_t n=i+1;
do
{
int t1=(int)str1[n]-48+x;
if(t1>=10)
{
str1[n]=(char)(t1%10+48);
++n;
}
else
{
str1[n]=(char)(t1+48);
}
if(n==str1.length())
{
str1+="1";
break;
}
x=t1/10;
}
while(x!=0); str1[i]=(char)(t+48);
}
else
{
str1[i]=(char)(t+48);
}
}
string &rstrResult=str1;
string strOut=invert(rstrResult);
return strOut;
} void init_map(map<char,double> &wmap)
{
for(char i='A';i<'K';++i)wmap[i]=0.1;
}
string get_max(vector<string> &vstr)
{
map<char,double> wmap;
init_map(wmap);
for(int i=0;i<vstr.size();++i)
{
double count =1.0;
for(int j=0;j<vstr[i].size();++j)//0对应个位,逆序
{ wmap[vstr[i][j]]=wmap[vstr[i][j]]+count;
count = count*10;
}
}
map<double,char> nmap;
map<char,double>::iterator it = wmap.begin();
while(it!=wmap.end()){
//cout<<"1="<<it->first<<" "<<it->second<<endl;
if(nmap.count(1.0/double(it->second))){
double dtmp=it->second-0.1;
while(nmap.count(1.0/double(dtmp)))dtmp=dtmp-0.1;
nmap[1.0/double(dtmp)]=it->first;
//cout<<"SEC1: "<<1.0/double(dtmp)<<"fir1:"<<it->first<<endl;
}
else {
//cout<<"SEC2: "<<1.0/double(it->second)<<" fir2:"<<it->first<<endl;
nmap[1.0/double(it->second)]=it->first;
}
it++;
}
map<char,char> idmap;
map<double,char>::iterator it0 = nmap.begin();
char num='9';
while(it0!=nmap.end()){
idmap[it0->second]=char(num);
cout<<idmap[it0->second]<<": "<<it0->second<<endl;
num = num-1;
it0++;
}
string res;
for(int i=0;i<vstr.size();++i)
{
inverse(vstr[i]);
for(int j=0;j<vstr[i].size();++j)
{
vstr[i][j]=idmap[vstr[i][j]];
}
cout<<vstr[i]<<endl;
res=intAdd(res,vstr[i]);
}
// inverse(res);
return res;
} int main()
{ int n;
while(cin>>n)
{
vector<string> vstr;
FR(i,n){
string stmp;
cin>>stmp;
inverse(stmp);
vstr.push_back(stmp);
}
cout<<get_max(vstr)<<endl;
}
return 0;
}

n组字母和最大的更多相关文章

  1. 信息安全-2:python之hill密码算法[原创]

    转发注明出处:http://www.cnblogs.com/0zcl/p/6106513.html 前言: hill密码算法我打算简要介绍就好,加密矩阵我用教材上的3*3矩阵,只做了加密,解密没有做, ...

  2. Ubuntu下用NdisWrapper安装网卡驱动

    下面是一个简单全面的使用NdisWrapper的指南.这是从Beginning Ubuntu Linux, Second Edition中提炼出来的. 这份指南是第8章的一部分.该章给出了在Ubunt ...

  3. java 正则

    ava - 正则表达式 - Pattern - Matcher 2013-08-21 14:35 3325人阅读 评论(0) 收藏 举报  分类: JavaSE(30)  版权声明:本文为博主原创文章 ...

  4. Unique Morse Code Words

    Algorithm [leetcode]Unique Morse Code Words https://leetcode.com/problems/unique-morse-code-words/ 1 ...

  5. 【ARTS】01_07_左耳听风-20181224~1230

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  6. leetcode笔记(五)809. Expressive Words

    题目描述 Sometimes people repeat letters to represent extra feeling, such as "hello" -> &qu ...

  7. js面试之一个字符串中出现次数最多的字符是?出现几次?

    最近在找面试题的时候发现了许多有趣的题目,在这里用随笔记录下~ 关于“一个字符串中出现次数最多的字符...”这种问题在笔试题中出现的频率还是很高的,我自己也找到了几种方法处理 var str = &q ...

  8. 院校-美国:哈佛大学(Harvard University)

    ylbtech-院校-美国:哈佛大学(Harvard University) 哈佛大学(Harvard University),简称“哈佛”,坐落于美国马萨诸塞州波士顿都市区剑桥市,是一所享誉世界的私 ...

  9. HPU暑期集训积分赛2

    A. 再战斐波那契 单点时限: 1.0 sec 内存限制: 512 MB 小z 学会了斐波那契和 gcd 后,老师又给他出了个难题,求第N个和第M个斐波那契数的最大公约数,这可难倒了小z ,不过在小z ...

随机推荐

  1. Codeforces Round #735 (Div. 2)

    这次的cf依旧掉分..... A题和B题在不懈死磕下瞎搞出来了,不过还是被C题卡住了... C. Mikasa 简述题意就是给定n和m,让n^0,n^1,n^2...,n^m,求着m+1个数中没有出现 ...

  2. cf14D Two Paths(树的直径)

    题意: N个点构成一棵树.树枝的长度都是1. 在当中找两条不相交[没有公共点]的路,使得二者长度之积最大. (2 ≤ n ≤ 200) 思路: 一开始思路好麻烦,好麻烦,好麻烦,,,,,,,而且WA, ...

  3. Oracle ORA 12541 报错解决过程

    Oracle 导入全库之后使用plsql登陆时报错 版本12C版本2 ORA-12541: TNS: No Listener 再oracle主机本地可以使用sqlplus 登陆,但是使用plsql无法 ...

  4. Device /dev/sdb excluded by a filter

    原因是添加的磁盘是在另一个虚拟机中新建的,已经有了分区表,现在的虚拟机并不能识别磁盘的分区表,运行parted命令重做分区表,中途需要输入三次命令(mklabel msdos -> yes-&g ...

  5. kafaka高效吞吐量-生产端,服务端,消费端

    零拷贝:sendfile 生产端 生产端:消息压缩,缓存批量发送,异步解耦 多线程并发:防止某一个业务阻塞等待 接收消息缓存 BufferPool设计:不释放 服务端 Reactor模型,顺序写,页缓 ...

  6. 集合之Map接口

    Map接口概述 Map与Collection并列存在.用于存储具有映射关系的数据 : key-value Map 中的 key 和 value 都可以是任何引用类型的数据 Map 中的 key 用Se ...

  7. Git 修改已提交的commit注释

    两种情况: 1.已经将代码push到远程仓库 2.还没将代码push到远程仓库,还在本地的仓库中 这两种情况下的修改大体相同,只是第一种情况最后会多一步 下面来说怎么修改 先搞清楚你要修改哪次的提交注 ...

  8. WPF进阶技巧和实战09-事件(2-多点触控)

    多点触控输入 多点触控输入和传统的基于比的输入的区别是多点触控识别手势,用户可以移动多根手指以执行常见的操作,放大,旋转,拖动等. 多点触控的输入层次 WPF允许使用键盘和鼠标的高层次输入(例如单击和 ...

  9. tabulate

    ValueError: headers for a list of dicts is not a dict or a keyword from: https://bitbucket.org/astan ...

  10. 深入理解Spring IOC容器

    本文将从纯xml模式.xml和注解结合.纯注解的方式讲解Spring IOC容器的配置和相关应用. 纯XML模式 实例化Bean的三种方式: 使用无参构造函数 默认情况下,会使用反射调用无参构造函数来 ...