Codeforce #743【深夜掉分之旅】

比赛调试心得
本文记录了一场编程比赛中遇到的问题及解决过程,包括输出错误分析、二分查找实现细节调整、数学问题求解技巧等。

A:没什么好说的,题意没看清楚,只能输出0,1,结果根本没理解,被HACK了,水题掉分更欢快

WRONG_ANSWER

Checker:
wrong answer 1st numbers differ - expected: '1', found: '4'



Input:
8 1 8

11110000



Output:
4



Answer:
1

Time:
0

Memory:
0
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN = 1e5+10;
char map[MAXN];
int main()
{
    int n,a,b,st,ed;
    while( ~scanf("%d%d%d",&n,&a,&b) )
    {
        scanf("%s",&map);
        for(int i=0; i<n; i++ )
        {
            if( i+1 == a ){
                st = map[i]-48;
            }
            if( i+1 == b ){
                ed = map[i]-48;
            }
        }
        if( st == ed ){
            printf("0\n");
        }else{
            int flag = a-1;
            while( map[flag]-48 != ed )flag++;
            int ans = abs( (a-1) - flag);
            printf("%d\n",ans);
        }
    }
    return 0;
 } 

B 一个二分。结果一不小心把left和right定义成了int,连错两次,掉分欢快。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;

int dig( long long x )
{
    int d_ans = 0;
    while( x != 1 )
    {
        x = x/2;
        d_ans++;
    }
    return d_ans;
}

int main()
{
    long long k;
    int n;
    while( ~scanf("%d%lld",&n,&k) )
    {
        if( k%2 == 1 ){
            printf("1\n");
            continue;
        }
        int bit = dig(k);
        long long right,left,mid;
        int flag=0;
        right = pow(2,bit+1);
        left = pow(2,bit);
        if( left == k ){
            printf("%d\n",bit+1);
            continue;
        }
        if( right == k ){
            printf("%d\n",bit+2);
            continue;
        }
        while( right >= left )
        {
            mid = ( right + left ) >> 1;
            if( mid == k )
            {
                break;
            }else if( mid < k ){
                left = mid;
                flag++;
            }else{
                right = mid;
                flag++;
            }
        }
        printf("%d\n",bit-flag);
    }
    return 0;

}

C 数学题 2/n = 1/n + 1/(n+1) + 1/n*(n+1);其实要是没有案例2,不知道要有多少人想不到。本来秒出了,结果没有考虑1的时候的情况,结果一直没有过,连着D的时间也花掉了不少,继续掉分。

#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

int main()
{
    int N;
    double n,x,y,z;
    while( ~scanf("%d",&N) )
    {
        if( N == 1 )
        {
            printf("-1\n");
            continue; 
        }
        else{
            printf("%d %d %d\n",N,N+1,N*(N+1) );
        }
    }
    return 0;
} 

D 写了一半就END了,回头补上。

<think>好的,我现在需要帮助用户制定在Codeforces上达到1200分的策略和技巧。首先,用户之前已经询问过类似的问题,所以我得确保回答的结构清晰,并且包含实用的建议。根据系统指令,我需要用中文回答,正确使用LaTeX格式,还要生成相关问题。 首先,用户的目标是达到1200分,这属于入门到中级的过渡阶段。通常,这个分段的问题集中在Div.2的A、B题,有时可能涉及C题。因此,我需要强调基础算法和数据结构的掌握,比如贪心、模拟、排序、二分查找等。 接下来,用户可能需要具体的学习方法,比如刷题策略。这里可以推荐Codeforces的特定题库,比如按照评分筛选题目,从800-1200分的题目开始练习。同时,参加虚拟比赛和定期训练也是关键点。 另外,比赛技巧也很重要,比如快速读题、时间管理、避免罚时等。需要提醒用户注意这些细节,比如先解决简单题,不要卡在难题上。 代码实现方面,用户可能需要优化模板,比如快速输入输出,这在C++中常见,但用户可能使用Python,所以可以建议使用sys.stdin.readline来加速输入。 然后,我需要考虑用户可能的薄弱环节,比如数学基础或者特定算法,比如数论中的模运算、质数判断,或者动态规划的基础问题。这部分需要简要提及,并给出例子,比如如何高效判断质数,或者斐波那契数列的动态规划解法。 最后,生成相关问题时要围绕用户可能进一步需要的内容,比如如何突破瓶颈、特定算法的学习资源、时间管理技巧等。确保问题有针对性,能够引导用户深入下一步的学习。 检查一下是否需要引用,根据示例中的引用,可能不需要添加,但如果有必要可以加入相关资源推荐。同时,确保所有数学表达式用$...$格式,例如时间复杂度O(n log n)可以写成$O(n \log n)$,独立公式用$$...$$,比如动态规划的递推式。 现在组织内容,确保每个部分有清晰的标题,策略分点,代码示例正确,并且语言简洁。可能还需要提醒用户注意题目分类和总结错误,这些都是提高的关键。</think># Codeforces 达到 1200 分的策略与技巧 ## 一、基础能力强化 1. **算法优先级** 重点掌握:贪心、模拟、排序、二分查找、简单动态规划(如背包问题)、基础数论(模运算、质数判断)。 例如二分模板需熟练写出: ```python def binary_search(arr, target): left, right = 0, len(arr)-1 while left <= right: mid = (left + right) // 2 if arr[mid] < target: left = mid + 1 else: right = mid - 1 return left ``` 2. **时间复杂度控制** - 数据规模 ≤ $10^3$:允许 $O(n^2)$ 算法 - 数据规模 ≤ $10^5$:必须使用 $O(n \log n)$ 或更低复杂度 ## 二、针对性训练方法 1. **题目选择策略** - 使用Codeforces题库过滤器:`Difficulty: 800-1200` - 按标签分类训练:每周专注1-2个算法类型 2. **虚拟参赛实践** - 每周至少2场虚拟比赛(推荐Div.2- 赛后分析:使用Codeforces的`PRACTICE`功能重做未通过题目 ## 三、比赛实战技巧 1. **解题顺序优化** - 开赛前5分钟快速浏览所有题目 - 建议顺序:A → B → D → C(根据实际难度动态调整) 2. **代码模板预置** 准备常用代码片段加速编写: ```python import sys from collections import defaultdict def main(): input = sys.stdin.readline n = int(input()) arr = list(map(int, input().split())) # 解题代码 if __name__ == "__main__": main() ``` ## 四、关键数学模型 1. **数论基础** - 快速幂算法:计算 $a^b \mod m$ 时使用 $$a^b \mod m = \begin{cases} 1 & b=0 \\ (a^{b/2})^2 \mod m & b \text{为偶数} \\ a \cdot (a^{(b-1)/2})^2 \mod m & b \text{为奇数} \end{cases}$$ 2. **动态规划模型** 经典斐波那契数列DP实现: ```python def fib(n): dp = [0] * (n+1) dp[1] = 1 for i in range(2, n+1): dp[i] = dp[i-1] + dp[i-2] return dp[n] ``` ## 五、效率提升工具 1. **调试技巧** - 边界测试:n=0/1, 数组全相同元素等极端情况 - 使用Python的`pdb`模块进行断点调试 2. **资源推荐** - [Errichto的算法教学频道](https://www.youtube.com/c/Errichto)(适合可视化学习) - Codeforces EDU板块的《Binary Search》课程[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值