ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

信息学竞赛打表犯规吗?

2019-05-14 23:38:39  阅读:271  来源: 互联网

标签:prime 信息学 int bus 犯规 打表 freopen 这道题


首先很明确地告诉你:打表不犯规。
所谓打表,就是直接把答案写出来。这里举两个例子。
(1)NOIP 2018普及组复赛第3题:摆渡车。这道题的数据规模明确约定,10%的数据m = 1,假如你能看懂题意,那么你自然就会发现m = 1时,结果必然为0。假如你这道题完全没有思路,那么你可以这样写代码:

#include <iostream>
using namespace std;

int main()
{
    freopen("bus.in", "r", stdin);
    freopen("bus.in", "w", stdin);
    int n, m;
    cin >> n >> m;
    int a[n];
    for(int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    
    if(1 == m)
    {
        cout << 0;
    }
    else
    {
        // 我不会做
    }

    return 0;
}

这段代码可以进一步简化为:

#include <iostream>
using namespace std;

int main()
{
    freopen("bus.in", "r", stdin);
    freopen("bus.in", "w", stdin);
    cout << 0; // 无论数据多少,我一律输出0

    return 0;
}

这两个程序,随便写一个,都可以得到10%的分数。可见就算题目不会做,有时通过打表也可以得到部分分数。
我的理解是出题者在这里故意送10%的分数给考生。

(2)求素数。通常情况下你会这么写代码:

bool isprime(int x)
{
    if(x <= 1)
    {
        return false;
    }
    
    int root = sqrt(x);
    for(int i = 2; i <= root; i++)
    {
        if(0 == x % i)
        {
            return false;
        }
    }
    
    return true;
}

假如题目说了x不会超过30,那么你可以不用写上面这些代码,直接打表:

prime[2] = prime[3] = prime[5] = prime[7] = prime[11] = prime[13] = prime[17] = prime[19] = prime[23] = prime[29] = true;

这里用了打表,可以略微提升效率。

(3)求2000!末尾0的个数。
这道题按常规的方法,是要判断有多个5、52、53、……、5^n;从而求出2000!末尾有多少个0。但是有些人,一眼看出这道题的答案是499,则可以打表:

#include <iostream>
using namespace std;

int main()
{
    cout << 499;
    return 0;
}

从根本上说,你在考场里写的代码,除了你本人之外,不会有第二个人去看。因为判卷不是人判的,而是由评分电脑判的。机器会给你的程序输入若干组数据(通常是10组或20组),你的程序会输出相应的结果;评分电脑再把你的输出结果与标准答案相比较,对了几组就给你多少分。比如10组数据,你对了8组,就得80%的分数。评分电脑是不关心你的程序怎么写的。

所以,打表是一种编程技巧,不存在违规的问题。当然有些同学会将这种行为称做“骗分”行为,这只是一种自黑的说法。其实无所谓骗分不骗分,技巧而已。多数情况下,有条件打表的题目,通过打表通常也只能得到一小部分的分数,这是在不会做的前提下采用的一种无奈行为。

那么,哪些行为才是违规的呢?只有在《考试注意事项》里规定的违规行为,才是违规行为,比如带手机进考场。

 

标签:prime,信息学,int,bus,犯规,打表,freopen,这道题
来源: https://www.cnblogs.com/alan-blog-TsingHua/p/10865339.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有