原题网址:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4114
感觉题意说的不够明确
其实是让你构造一个只有指定的几种字符组成的序列,使得它和给出的这么多数的匹配程度最高,也就是和其他序列同一位置字符不同的字符的总数最小..........
为了达到要求,那么最优的结果的每一位的字符肯定是所有的序列在这一位上出现次数最多的字符!
想想看....
然后直接构造统计函数,对每一位进行统计,出现最多而且字典序最小的字符就是每一位需要的字符
#include<stdio.h>
#include<string.h>
#define maxn 1005
char x[55][maxn];
int n,m,vis[26],sum;
int less(int k)
{
memset(vis,0,sizeof(vis));
for(int i=0;i<m;++i)
{
++vis[x[i][k]-'A'];//
}
int tpmax=0,mark=0;
for(int i=0;i<26;++i)
{
if(vis[i]>tpmax)//找最多的字符
{
tpmax=vis[i];
mark=i;//标记这个字符是多少
}
}
sum+=(m-tpmax);//位置不同的总数
return mark+'A';
}
void slove()
{
sum=0;//注意清零
for(int i=0;i<n;++i)//每次查找每一位
{
int tp=less(i);
printf("%c",tp);//直接输出每一位
}
printf("\n%d\n",sum);//输出差别和
}
int main()
{
int t;
// freopen("shuju.txt","r",stdin);
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&m,&n);
for(int i=0;i<m;++i)
{
scanf("%s",x[i]);
}
slove();
}
return 0;
}