uva 10940 - Throwing cards away II

179 篇文章 0 订阅

题目链接:uva 10940 - Throwing cards away


题目大意:给出n,表示有n张牌,按照1~n的顺序排列,每次取出顶部的两张牌,第一张丢掉,第二张放到牌堆的最底部,问最后剩下的那张牌是多少。


解题思路:可能我的思路有点难理解,我不是通过打表找规律去推公式, 而是模拟了人的思维去处理这个牌的问题,首先第一次为n张牌,第一遍丢牌肯定是奇数牌,所以可以将所有的偶数留下,标号均可以模2,问题转换成1~n/2张牌的问题。

其次,每一次划分子问题的时候,当前次丢掉奇数牌还是偶数牌和上一轮丢掉奇数牌还是偶数牌以及牌的数量有关。

然后处理好递归返回值的公式就可以了。


算法复杂度为o(logn)。


#include <stdio.h>

int solve (int n, int flag) {
	int tmp = (n + flag) % 2;
	if (n == 1) return 1;
	if (flag) {
		return solve((n + 1) / 2, tmp) * 2 - 1;
	} else {
		return solve(n / 2, tmp) * 2;
	}
}

int main () {
	int n;
	while (scanf("%d", &n), n) {
		printf("%d\n", solve(n, 0));
	}	
	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值