蓝桥杯 算法提高 ADV-141 判断名次 逻辑题, 第12周

算法提高 判断名次
时间限制: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 <iostream>
#include <cstring>
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]-'0')
            return 1;
    }
    if(str[1]=='<'&&str[2]=='=')
    {
        if(a[str[0]-'A']<=str[3]-'0')
            return 1;
    }
    if(str[1]=='=')
    {
        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;
    }
    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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值