poj 1013 && poj 1029【寻找硬币】

参考题解:http://www.cppblog.com/guyuecanhui/articles/88302.html

这两个题是差不多的,都是给出一些称量结果寻找“假”硬币(和其它硬币重量不同)。

用排除法,分情况讨论:
(1) 当结果为even(=)时,说明称上的几个硬币一定是真币
(2) 当结果为up(>)时,说明其余的硬币一定是真币,并且重的硬币一定在左边,轻的硬币一定在右边(所以这是把左边的硬币标记为重,右边的硬币标记为轻)。
(3) 当结果为down(<)时,说明其余的硬币一定是真币,并且重的硬币一定在右边,轻的硬币一定在左边(所以这是把左边的硬币标记为轻,右边的硬币标记为重)。
      用一个数组记录每个钱币的状态,初始为-1(表示不确定状态),如果一定为真币记为0,如果可能较重记为2,如果可能较轻记为1,最后判断大于0的钱币一定为假币,而相应的状态表示它的相对重量。
     如果上次判断一个钱币为真币,则不论下次结果如何,它还应当是真币;如果上次判断它可能较轻,而本次判断它可能较重,则它一定是真币(等于说是这种不平衡是由其它硬币造成的,因为如果该硬币为假币的话,假设它较重,那一定是它在哪边,哪边就较重,而不会出现这种又重又轻的情况),反之亦然!


//poj 1013
#include <cstdio>
#include <cstring>

#define N 12

int main()
{
	int T, state[N], tmp[N], len;
	char left[N], right[N], res[N];
	scanf("%d", &T);
	while(T--)
	{
		memset(state, -1, sizeof(state));
		for(int i=1; i<=3; ++i)
		{
			scanf("%s %s %s", left, right, res);
			len = strlen(left);
			if(strcmp(res, "even") == 0)
			{
				for(int i=0; i<len; ++i)
					state[left[i]-'A'] = 0, state[right[i]-'A'] = 0;
			}
			else if(strcmp(res, "down") == 0)
			{
				memcpy(tmp, state, sizeof(tmp));
				memset(state, 0, sizeof(state));
				for(int i=0; i<len; ++i)
					state[left[i]-'A'] = 1, state[right[i]-'A'] = 2;
				for(int i=0; i<12; ++i)
					if(tmp[i] >= 0 && tmp[i] != state[i]) state[i] = 0;
			}
			else
			{
				memcpy(tmp, state, sizeof(tmp));
				memset(state, 0, sizeof(state));
				for(int i=0; i<len; ++i)
					state[left[i] - 'A'] = 2, state[right[i]-'A'] = 1;
				for(int i=0; i<12; ++i)
					if(tmp[i] >= 0 && tmp[i] != state[i]) state[i] = 0;
			}
		}
		for(int i=0; i<12; i++)
		{
			if(state[i] > 0)
			{
				printf("%c is the counterfeit coin and it is %s.\n", (char)(i+'A'), state[i] == 1 ? "light" : "heavy");
				break;
			}
		}
	}
	return 0;
}


//poj 1029
#include <cstdio>
#include <cstring>

#define N 1005

int state[N], tmp[N], left[N/2], right[N/2];

int main()
{
	int n, k, p, i, ans = 0;
	char r[5];
	scanf("%d %d", &n, &k);
	memset(state, -1, sizeof(state));
	while(k--)
	{
		scanf("%d", &p);
		for(i=1; i<=p; ++i) scanf("%d", &left[i]);
		for(i=1; i<=p; ++i) scanf("%d", &right[i]);
		scanf("%s", r);
		if(r[0] == '=')
		{
			for(i=1; i<=p; ++i)
				state[left[i]] = 0, state[right[i]] = 0;
		}
		else if(r[0] == '<')
		{
			memcpy(tmp, state, sizeof(tmp));
			memset(state, 0, sizeof(state));
			for(i=1; i<=p; ++i)
				state[left[i]] = 1, state[right[i]] = 2;
			for(i=1; i<=n; i++)
				if(tmp[i] >= 0 && tmp[i] != state[i]) state[i] = 0;
		}
		else
		{
			memcpy(tmp, state, sizeof(tmp));
			memset(state, 0, sizeof(state));
			for(i=1; i<=p; ++i)
				state[left[i]] = 2, state[right[i]] = 1;
			for(i=1; i<=n; i++)
				if(tmp[i] >= 0 && tmp[i] != state[i]) state[i] = 0;
		}
	}
	for(i=1; i<=n; ++i)
		if(state[i])
			ans++, p = i;
	if(ans != 1)	printf("0\n");
	else	printf("%d\n", p);

	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值