codeforces 刷题指南

本文作者受到codeforces新上线的难度指数功能启发,编写了一个爬虫来分析每个分类的题目数量、平均难度、最高难度和最低难度。截至2018.11.12,得出的结论对Codeforces平台上的刷题者提供了有益的数据参考。

https://blog.youkuaiyun.com/qq_16964363/article/details/79224776
主要参考这篇文章,侵删。

近期cf上线了难度指数功能,将每道题的难度量化。那么我根据这篇博主的启发, 做了个爬虫来对每个分类的难度进行分析。先上爬虫代码:

# -*- coding: utf-8 -*-

import json
import urllib.request

from bs4 import BeautifulSoup
sum_difficulty = {}
avg_difficulty = {}
min_difficulty = {}
max_difficulty = {}
problems_count = {}

max_page = 48

for i in range(1, max_page):
    print ('parsing page %d' % i)
    url='http://codeforces.com/problemset/page/%s'%str(i)
    data=urllib.request.urlopen(url).read() #发起请求并读取回应 
    data=data.decode('UTF-8') 

    soup = BeautifulSoup(data, 'html.parser')

    for p in soup.find(class_='problems').find_all('tr'):
        tds = p.find_all('td')
        if len(tds) != 5:
            continue
        
        difficulty_span = tds[3].span
        if difficulty_span is None:
            continue

        difficulty = int(difficulty_span.string)

        for notice in tds[1].find_all(class_='notice'):
            tag=notice.string
            if (tag in problems_count) == False:
                # 初始化
                problems_count[tag] = 0
                sum_difficulty[tag] = 0
                min_difficulty[tag] = 10000
                max_difficulty[tag] = -1
            
            #迭代
            problems_count[tag] += 1
            sum_difficulty[tag] += difficulty
            min_difficulty[tag] = min(min_difficulty[tag], difficulty)
            max_difficulty[tag] = max(max_difficulty[tag], difficulty)

for tag in problems_count:
    avg_difficulty[tag] = sum_difficulty[tag]//problems_count[tag]


print ('标签,题目数,平均难度,最高难度,最低难度')

d = sorted(problems_count.keys(), key = lambda k: k[0])
for tag in d:
    print (tag,problems_count[tag],avg_difficulty[tag],max_difficulty[tag],min_difficulty[tag], sep=',')

我主要分析了每个标签(题目类型)的题目数、平均难度、最高难度、最低难度,结论如下(截止到2018.11.12)

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值