算法提高 判断名次
时间限制:1.0s 内存限制:256.0MB
提交此题
问题描述
某场比赛过后,你想要知道A~E五个人的排名是什么,于是要求他们每个人说了一句话。(经典的开头……-_-!)得了第1名的人23,说了假话;得了第5名的人不好意思,也说了假话;为了使求解问题简单,第3名同样说了假话。(奇数名次说假话)
输入格式
共5行,各行依次表示A~E说的话。
每行包含一个形如“A>=3”的名次判断,即一个大写字母+关系运算符+一个数字,不包含空格。
大写字母AE,关系运算<、<=、=、>=、>、!=,数字15。注意:等于是“=”不是“==”!
输出格式
可能有多解,请按照字典序输出排名序列,每个解一行
最后一行输出解的数量
样例输入
A=2
D=5
E>3
A>2
B!=1
样例输出
ACDEB
AECBD
BADCE
BCADE
BDACE
CEADB
CEBDA
7
分析:用a[0],a[1],a[2],a[3],a[4]分别表示A,B,C,D,E的名次,s1表示谎话数,s2表示真话数。
PS:本文来自https://bbs.csdn.net/topics/391897117?page=1#post-403648843,博主说他的80分,我借用并且改了一下,现在满分了。+代码如下:
#include
#include
using namespace std;
int a[5], s1, s2, sum = 0;
char ans[20][10], saying[5][10];
//表达式解析
bool judge(char *str)
{
if(str[1]=='<'&&str[2]>='1'&&str[2]<='9')
{
if(a[str[0]-'A']'&&str[2]=='=')
{
if(a[str[0]-'A']>=str[3]-'0')
return 1;
}
if(str[1]=='>'&&str[2]>='1'&&str[2]<='9')
{
if(a[str[0]-'A']>str[2]-'0')
return 1;
}
if(str[1]=='!'&&str[2]=='=')
{
if(a[str[0]-'A']!=str[3]-'0')
return 1;
}
return 0;
}
int main()
{
for(int i = 0; i < 5; i++)
{
cin >> saying[i];
}
for(a[0] = 1; a[0] <= 5; a[0]++)
{
for(a[1] = 1; a[1] <= 5; a[1]++)
{
if(a[1] == a[0])
continue;
for(a[2] = 1; a[2] <= 5; a[2]++)
{
if(a[2] == a[0] || a[2] == a[1])
continue;
for(a[3] = 1; a[3] <= 5; a[3]++)
{
if(a[3] == a[0] || a[3] == a[1] || a[3] == a[2])
continue;
for(a[4] = 1; a[4] <= 5; a[4]++)
{
if(a[4] == a[0] || a[4] == a[1] || a[4] == a[2] || a[4] == a[3])
continue;
//如果没有重复
s1 = 0, s2 = 0;
//计算真话个数和谎话个数
for(int i = 0; i < 5; i++)
{
if(judge(saying[i]))
s2++;
else if(a[i] % 2)
s1++;
}
//如果符合标准,则执行
if(s1 == 3 && s2 == 2)
{
for(int i = 0; i < 5; i++)
if(a[i] == 1)
ans[sum++][0] = 'A' + i;
for(int i = 0; i < 5; i++)
if(a[i] == 2)
ans[sum-1][1] = 'A' + i;
for(int i = 0; i < 5; i++)
if(a[i] == 3)
ans[sum-1][2] = 'A' + i;
for(int i = 0; i < 5; i++)
if(a[i] == 4)
ans[sum-1][3] = 'A' + i;
for(int i = 0; i < 5; i++)
if(a[i] == 5)
ans[sum-1][4] = 'A' + i;
}
}
}
}
}
}
char tmp[10];
for(int i = 0; i < sum - 1; i++)//字典序排列
for(int j = 0; j < sum - 1 - i; j++)
{
if(strcmp(ans[j], ans[j+1]) > 0)
{
strcpy(tmp, ans[j]);
strcpy(ans[j], ans[j+1]);
strcpy(ans[j+1], tmp);
}
}
for(int i = 0; i < sum; i++)
cout << ans[i] << endl;
cout << sum << endl;
return 0;
}