第12届北师大校赛热身赛第二场 B起床的烦恼

79 篇文章 0 订阅

题目链接:http://www.bnuoj.com/bnuoj/contest_show.php?cid=3570#problem/43572

题目大意:

Nono从一开始数数,他每数一个数时会计算这个数中1的个数(如211中有两个1)并对1的个数进行累和,当1的个数之和不小于x时,nono就要起床了。特别需要注意的是,当nono数数达到10000时,nono就会因为数太久而再次睡着……
现在nono定下了x,他想知道他数到多少就需要起床了(或是他可以再睡一觉)。


明显是动态规划问题,通过递推预处理可以比较快的得出,a[i]=a[i-1]+sum一边不断的累加到数i时,1的个数,一边当 i%10==1时,更新a[case]=i,即当x=case时,则需要数数数到多少。

附上代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAX=100001;
int a[MAX];
void init()
{
    int cas=1;
    for(int i=1;i<MAX;i++)
    {
        int k=i,sum=0;
        while(k)
        {
            if(k%10==1)
            {
                sum++;
                a[cas++]=i;//关键部分
            }
            k/=10;
        }
        a[i]=a[i-1]+sum;
    }
}
int main()
{
    init();
    int T;
    while(cin>>T)
    {
        while(T--)
        {
            int n;
            cin>>n;
            if(a[n]<10000)
            {
                cout<<a[n]<<endl;
            }
            else
            {
                cout<<"zzz"<<endl;
            }
        }
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值