您的位置:首页 > 其它

蓝桥杯 判断名次

2015-12-11 12:43 411 查看
  算法提高 判断名次  

时间限制: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代码
<pre name="code" class="cpp">#include<iostream>
#include<stdio.h>
#include<string>
#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!=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; j<say1[k][2]-'0'-1; j++)
if(str[j]==say1[k][0])
{
flag=1;

}
if(!flag)
break;
p++;
}
else if(say1[k][1]=='<'&&say1[k][2]=='=')
{
for(j=0; j<say1[k][3]-'0'; j++)
if(str[j]==say1[k][0])
{
flag=1;

}
if(!flag)
break;
p++;
}
else if(say1[k][1]=='!'&&say1[k][2]=='=')
{
td=say1[k][3]-'0'-1;
if(str==say1[k][0])
break;
p++;
}
}

if(((str[1]=='A'+t[0]&&str[3]=='A'+t[1])||(str[1]=='A'+t[1]&&str[3]=='A'+t[0]))&&(p==5))
{
cnt++;
ans[an++]=str;
//	cout<<str<<endl;
x=0;
flag=0;
break;
}
}
}
}
}
}
}
for(i=0; i<5; i++)
say1[i]=say[i];
}
string tmp;
for(i=0; i<an; i++)
{
for(j=i+1; j<an; j++)
{
if(ans[i]>ans[j])
{
tmp=ans[i];
ans[i]=ans[j];
ans[j]=tmp;
}
}
}
for(i=0; i<an; i++)
cout<<ans[i]<<endl;
cout<<cnt<<endl;
return 0;
}




这个题还是写得太暴力了……有个稍微简单易懂的代码,然而只得了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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息