问题 F: Ada 学单双 规律题

问题 F: Ada 学单双
时间限制: 1 Sec  内存限制: 128 MB
提交: 319  解决: 54
[提交][状态][讨论版]
题目描述
Ada四岁了,开始学单数和双数,单是1,3,5,7,9,双是2,4,6,8,10。这样未免太乏味了,为了让她感兴趣,爸爸设计了下面的一个小游戏:
(1)给定数字系列1到n并依次编号
(2)给定一个字符串,里面的字符只有0或者1
(3)如果当前的数字系列只含一个整数,游戏终止。否则读取字符串中的下一个字符为当前字符。
(4)如果当前字符为0,把所有双数编号的数字删除;如果字符为1,把所有单数编号的数字删除。剩下的数字按次序重新从1开始编号。然后跳转到第三步。
问最后留下的数字是几?100以内的Ada也许还能应付,太大的数字就看你了。

给一个具体的例子,n为10,字符串为"1010101",
第一个读出的字符是'1',删掉所有单数编号的数字,剩下的数字系列是2 4 6 8 10。
第二个读出的字符是'0',删掉所有双数编号的数字,剩下的数字系列是2 6 10。
第三个读出的字符是'1',删掉所有单数编号的数字,剩下的数字系列是6。 
输入
输入包含多组数据(不超过5万组),每组数据一行,由空格分开的整数n和01字符串组成,1<= n < 2^31,字符串的长度保证游戏能够结束。

输出
对于每组数据,输出一行,即最后留下的数字。

样例输入
10 1010101
9 010101
样例输出
6
3
提示

来源: http://acm.hnust.edu.cn/JudgeOnline/problem.php?cid=1204&pid=5


思路:  元是数字1  记为ans
           1.当第i次执行去奇数命令时    ans+=2^i(-1)
           2.边界条件 -->剩余1个元素
                            判断方法   N个数  执行去奇数  剩余ceil(N/2.0)
                                                          执行去偶数  剩余 N/2   //整除
#include <cstdio>
#include <cmath>
#include <cstring>
char A[50];int N;
int Cal(void)
{
    int ans=1,len=strlen(A);
    for(int i=0;N!=1&&i<len;i++)
    {
        if(A[i]-'0')//去单
        {
            N/=2;
            ans+=(1<<i);//因为字符串数组本身从0开始
        }
        else N=ceil(N/2.0);; //去双
     //  printf("i==%d N==%d ans==%d\n",i,N,ans);
    }
    return ans;
}
int main()
{
    //freopen("D:\\test.txt","r",stdin);
    while(~scanf("%d %s",&N,A)) printf("%d\n",Cal());
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值