uva--1368(贪心,字符串模拟)

点击打开链接


该题是一个带有贪心思想的字符串模拟题,题目给定m个长度为n的字符串,让你求一个长度为n的字符串,使得该字符串与这m个字符串对应位置的字符不同的个数和最小。

要使对应位置不同字符最少,则该字符串每个字符优先选择该位置出现次数多的字符,若次数相同则选择字典序更小的字符。

代码:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define from(i,a,n)   for(int i=a;i=a;i--)
#define EPS 1e-10
#define mod 1000000007
using namespace std;

const double INF=0x3f3f3f3f;
const int MAX =1000+10;
int m,n,pos,num;
char s[52][MAX],s1[MAX],s2[51];//s1用来记录字典序最小的符合条件的序列,s2用来处理每一个位置的字符
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>m>>n;
        int dis=0;
        memset(s1,0,sizeof(s1));
        num=0;
        //getchar();
        from(i,0,m)
        cin>>s[i];
        from(i,0,n)
        {
            pos=0;
            int maxlen=-INF,cnt=1;
            char c;
            from(j,0,m)
            s2[pos++]=s[j][i];//将第i个位置的所有字符取出
            sort(s2,s2+pos);//按升序排序,那么最先找到的一定是字典序小的字符
            c=s2[0];
            from(j,1,pos)
            {
                if(s2[j]==s2[j-1]) cnt++;
                else
                {
                    if(maxlen


你可能感兴趣的:(UVA,ACM,模拟)