蓝桥杯 判断名次

  算法提高 判断名次  
时间限制:1.0s   内存限制:256.0MB
    
问题描述
  某场比赛过后,你想要知道A~E五个人的排名是什么,于是要求他们每个人说了一句话。(经典的开头……-_-!)得了第1名的人23,说了假话;得了第5名的人不好意思,也说了假话;为了使求解问题简单,第3名同样说了假话。(奇数名次说假话)
输入格式
  共5行,各行依次表示A~E说的话。
  每行包含一个形如“A>=3”的名次判断,即一个大写字母+关系运算符+一个数字,不包含空格。
  大写字母A~E,关系运算<、<=、=、>=、>、!=,数字1~5。注意:等于是“=”不是“==”!
输出格式
  可能有多解,请按照字典序输出排名序列,每个解一行
  最后一行输出解的数量
样例输入
A=2
D=5
E>3
A>2
B!=1
样例输出
ACDEB
AECBD
BADCE
BCADE
BDACE
CEADB
CEBDA
7


100分AC代码
#include
#include
#include
#define N 1000
using namespace std;
string op(string cor)
{
    if(cor[1]=='=')
    {
        cor+=cor[2];
        cor[1]='!';
        cor[2]='=';
    }
    else if(cor[1]=='!'&&cor[2]=='=')
    {
        cor[2]=cor[3];
        cor[1]='=';
    }
    else if(cor[1]=='>'&&cor[2]!='=')
    {
        cor+=cor[2];
        cor[1]='<';
        cor[2]='=';
    }
    else if(cor[1]=='>'&&cor[2]=='=')
    {
        cor[2]=cor[3];
        cor[1]='<';
    }
    else if(cor[1]=='<'&&cor[2]!='=')
    {
        cor+=cor[2];
        cor[1]='>';
        cor[2]='=';
    }
    else if(cor[1]=='<'&&cor[2]=='=')
    {
        cor[2]=cor[3];
        cor[1]='>';
    }
    return cor;
}
int main()
{
    string str,say[5],say1[5],ans[10];
    int i,j,a,b,c,d,e,cnt=0,k,x,flag=0,u,v,w,t[2],tr=0,td=0,p=0,an=0;
    for(i=0; i<5; i++)
        cin>>say[i];
    for(i=0; i<5; i++)
        say1[i]=say[i];
    for(u=0; u<5; u++)
        for(v=u+1; v<5; v++)
            for(w=v+1; w<5; w++)
            {
                tr=0;
                for(int f=0; f<5; f++)
                    if(f!=u&&f!=v&&f!=w)
                    {
                        t[tr++]=f;
                    }
                say1[u]=op(say1[u]);
                say1[v]=op(say1[v]);
                say1[w]=op(say1[w]);
                for(a=0; a<5; a++)
                {
                    for(b=0; b<5; b++)
                    {
                        for(c=0; c<5; c++)
                        {
                            for(d=0; d<5; d++)
                            {
                                for(e=0; e<5; e++)
                                {
                                    str=('A'+a);
                                    str+=('A'+b);
                                    str+=('A'+c);
                                    str+=('A'+d);
                                    str+=('A'+e);
                                    if(str[0]!=str[1]&&str[0]!=str[2]&&str[0]!=str[3]&&str[0]!=str[4]&&str[1]!=str[2]&&str[1]!=str[3]
                                            &&str[1]!=str[4]&&str[2]!=str[3]&&str[2]!=str[4]&&str[3]!=str[4])
                                    {
                                        p=0;
                                        for(k=0; k<5; k++)
                                        {
                                            flag=0;
                                            if(say1[k][1]=='=')
                                            {
                                                td=say1[k][2]-'0'-1;
                                                if(str[td]!=say1[k][0])
                                                    break;
                                                p++;
                                            }
                                            else if(say1[k][1]=='>'&&say1[k][2]!='=')
                                            {
                                                for(j=say1[k][2]-'0'; j<5; j++)
                                                    if(str[j]==say1[k][0])
                                                    {
                                                        flag=1;
                                                    }
                                                if(!flag)
                                                    break;
                                                p++;
                                            }
                                            else if(say1[k][1]=='>'&&say1[k][2]=='=')
                                            {
                                                for(j=say1[k][3]-'0'-1; j<5; j++)
                                                    if(str[j]==say1[k][0])
                                                    {
                                                        flag=1;
                                                    }
                                                if(!flag)
                                                    break;
                                                p++;
                                            }
                                            else if(say1[k][1]=='<'&&say1[k][2]!='=')
                                            {
                                                for(j=0; jans[j])
            {
                tmp=ans[i];
                ans[i]=ans[j];
                ans[j]=tmp;
            }
        }
    }
    for(i=0; i


 
    


这个题还是写得太暴力了……有个稍微简单易懂的代码,然而只得了60分,有两组数据没过,暂时还没有找出问题。我放在论坛上了,有知道的同学可以指点一下~论坛地址:http://bbs.csdn.net/topics/391897117

测试数据:
input1:
A=2
D=5
E>3
A>2
B!=1

output1:
ACDEB
AECBD
BADCE
BCADE
BDACE
CEADB
CEBDA
7

input2:
C<=3
A=1
B=1
E>=4
D!=2

output2:
AEDBC
BDACE
BEACD
BEDCA
CDBAE
CEBAD
CEDAB
DECAB
8

input3:
E!=4
D<=4
B=1
C!=2
A=3

output3:
BCAED
BCEAD
2

input4:
D>3
E!=3
D>4
B=1
A>3

output4:
BAEDC
CBDEA
CEDBA
DBCEA
DECBA
5

input5:
A>=5
A>4
A=5
A=5
B<=1

output5:
0




你可能感兴趣的:(蓝桥杯_算法提高)