ZOJ-2273

本题我无耻地使用了打表,然后找出了规律,最后用了if-else作弊过的。。附上AC和打表代码,为了追求效率还把本来AC的python代码改成了C。。真是蛋疼无比

#include<stdio.h>

int main()
{
    int num;
    while (scanf("%d", &num) != EOF)
    {
        if (num < 3)
            putchar('1');
        else if (num < 10)
            putchar('3');
        else if (num < 26)
            putchar('0');
        else if (num < 90)
            putchar('6');
        else if (num < 264)
            putchar('0');
        else if (num < 947)
            putchar('6');
        else if (num < 3008)
            putchar('9');
        else if (num < 37174)
            putchar('0');
        else
            putchar('7');
        putchar('\n');
    }
    return 0;
}

打表代码,要跑个10几分钟。。慎运行

def end_index(src, number):
    length = len(src)
    low = 0
    high = length - 1
    center = (low + high) / 2
    while(src[center][1] != number):
        if(src[center][1] > number):
            high = center
        else:
            low = center
        center = (low + high) / 2
    while(src[center][1] == number):
        center += 1
        if center == length:
            break
    return center - 1

src = []
for i in range(1, 100000):
    for j in list(str(i)):
        temp = []
        temp.append(j)
        temp.append(i)
        src.append(temp)
        
f = open('../output.txt', 'w')
s = ''
for num in range(1, 100001):
    sublist = src[:end_index(src, num) + 1]
    even = True
    while(len(sublist) != 1):
        begin = 1 if even else 0
        del sublist[begin::2]
        even = not even
    s += str(sublist[0][0])
    if num % 1000 == 0:
        f.write(s)
        f.write('\n')
        s = ''

f.flush()
f.close()



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值