骗分技巧大全

目录:

  1. 骗分是什么

  2. 青铜:打表,最实用的骗分

  3. 白银:无解最好玩

  4. 黄金:小学数学找规律

  5. 铂金:千能的模拟

  6. 钻石:爆搜,最强的骗分技巧

  7. 王者:听天由命

  8. 天神:贪心的合并

  9. 上帝:报复性心理——死循环

  10. 实战演练

11.结语

一. 骗分是什么

真香定律中说道,做出超范围的事总会遭受他人打脸,所以,骗分也是有坏处的。

骗分,顾名思义,不会写的题骗几分,积小成多,很可能骗分的蒟蒻就比认真做题xc的蒟蒻高出几分。接下来,就让我们学习骗分吧!

二. 青铜:打表,最实用的骗分

打表是性价比比较高的骗分技巧。在赛场上的最后时刻,选择打表准没错。

1)样例——白送分

很多时候,样例是做题时的帮手,他可以帮助判断你的代码是否有明显错误,也同样可以用来骗分。美国比赛 \(USACO\) 当中,样例必须是第一个测试数据。具体操作贼简单,不讲了。

2)数学时间

有时候,关于数学的题目,且数据范围小,就直接把所有情况动手算出来,\(if-else\) 直接输出。

让我们来看一道 例题

这题主要应用到栈,但是许多蒟蒻不会,只好骗分,那么这题怎么骗分呢?

我们定睛一看:\(n \le 18\)

我天,真是的,这也太小了吧!

所以我们直接算算就算出来了。

int a[18] = {1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700};
cin >> n;
cout << a[n - 1];

当然,直接就 \(AC\) 了。

3)打表的结论

打表实际上代码量有时较多,但是思考比较少,属于性价比较高的一种骗分方法。

三. 白银:无解最好玩

接下来的这一章是所有蒟蒻最喜欢的:无解。话不多说,先来上例题:P1078 文化之旅

这是非常好的一个利用无解骗分的题目,对蒟蒻们来说,这道绿题有点难,但是请

看他的最后一句话:

一个整数,表示使者从起点国家到达终点国家最少需要走的距离数(如果无解则输出 \(-1\)

看见没有!无解输出 \(-1\)

所以只要输出 \(-1\) 就可以得到 \(10\) 分,甚至 \(20,30\) 分!

怎么样,是不是很神奇!!!

这种方法也可以用在输出 \(yes\)\(no\)情况 当中,或者是只有两三种输出文本的 情况 里。

那么,我们这一章就讲到这里。

四. 黄金:小学数学找规律

首先声明:本节讲的规律不是正当的算法规律,而是数据的特点。


例题

如果不看题目,你会发现,这么一个算式,怎么算啊!

没事,你要用到找规律。

我们可以看到给了一组样例,好嘛,找不了规律。

那么这就要考验数学了,只需要用纸和笔算出来一两组小数据的结果,就能很容易发现这是斐波那契数列了。

其实就这么简单。

别看找规律麻烦,真正要用到它的时候就能派上大用场!

当然,找规律是所有的骗分技巧中最不实用的一种方法,他只能在合适的时候用,

例如斐波那契数列这道题就适用,文化之旅就不好用了。所以一定要谨慎地使用找规律。

某些题目会给你很多样例,你就可以观察他们的特点了。有时,数据中的某一个 (或几个)数,能通过简单的关系直接算出答案。

只要你找到了规律,在很多情况下你都能得到可观的分数。

这样的题目大多出现在 \(CF、Atcoder、NOI\) 或更高等级的比赛中,本人蒟蒻一个,就不举例了。传说某人去省选时专门琢磨数据的规律,结果有一题得了 \(30\) 分。

那么这一章就到此结束了。

五. 铂金:千能的模拟

本章我们要进入算法了。

请蒟蒻中的蒟蒻自行退出。

正文:

模拟是一种朴素算法,他在骗分里却很实用。

他主要是骗一些高级数据结构的分,最常见的就是线段树。

那么我们就来看一道不在洛谷上的有技术含量但是能用模拟骗分的USACO线段树题目。

  排 队(USACO 2007 January Silver)

  【问题描述】
  每天,农夫约翰的 N(1 ≤ N ≤ 50000)头奶牛总是按同一顺序排好队,有一天,约翰决定让一些牛玩一场飞盘游戏(Ultimate Frisbee),他决定在队列里选择一群位置连续的奶牛进行比赛,为了避免比赛结果过于悬殊,要求挑出的奶牛身高不要相差太大。

  约翰准备了 Q(1 ≤ Q ≤ 200000)组奶牛选择,并告诉你所有奶牛的身高 Hi(1 ≤ Hi ≤ 10^6)。他想知道每组里最高的奶牛和最矮的奶牛身高差是多少。

  注意:在最大的数据上,输入输出将占据大部分时间。

  【输入】
  第一行,两个用空格隔开的整数 N 和 Q。 第 2 到第 N + 1 行,每行一个整数,第 i + 1 行表示第 i 头奶牛的身高 Hi 第 N + 2 到第 N + Q + 1 行,每行两个用空格隔开的整数 A 和 B,表示选择从 A 到 B 的所有牛(1 ≤ A ≤ B ≤ N)

  【输出】
  共 Q 行,每行一个整数,代表每个询问的答案。

  输入样例 输出样例
  6 3
  1
  7
  3
  4
  2
  5
  1 5
  4 6
  2 2 6
  3
  0

这道题一瞅就很难,我们蒟蒻不能硬啃。

我们来看看这道题怎么骗分。

找规律找不了,没有无解操作。

难道只能打表吗?

然而我们发现,这题是个线段树题,所以我们可以用模拟来骗分!

所以,我们只需要写一个程序,模拟程序,\(40-50\) 分就有了!

for(int i = 1; i <= q; i ++){
	scanf("%d %d", &a, &b);
	int min = 0x3f3f3f3f, max = 0x3f3f3f3f;
	for(int i = a; i <= b; i ++){
		if(h[i] < min) min = h[i];
		if(h[i] > max) max = h[i];
	}
	printf("%d\n", max - min);
}

搞定了!\(50\) 分!

那么我们这章就到这儿了。

六. 钻石:爆搜,最强的骗分技巧

欢迎来到爆搜这章。

爆搜,顾名思义,暴力枚举和搜索。

1)暴力枚举

暴力枚举不用说,三连击 是一道很好的练习题。

那我们怎样用暴力枚举骗分呢?这块就不上代码了,累了

首先我们要清楚,暴力枚举只有在有思路的时候用。

暴力枚举一般用来骗什么分呢?有三种。

1.搜索
2.\(DP\)
3.所有只能看明白有思路不会写的题目
所有的题有思路不会写的时候,不用想那些类似贪心、\(dp\) 这类高级算法,用暴力直接求得分,有时间再钻研。

2)万能 DFS

搜索里有 \(DFS\)\(BFS\),但是 \(BFS\) 不适合骗分。

\(DFS\) 是搜索中的重要算法,包括着回溯,但我们看来,图论神马的都是浮云,关键就是如何骗分。

\(DFS\) 对于骗分是至关重要的。比如说,一些 \(dp\),可以 \(DFS\);数论,可以 \(DFS\);剪枝的题,更能 \(DFS\)。下面有一道 dp 例题

看到没!\(30%\)\(10\) 以内的!

我们的 \(DFS\) 就要瞄准这里。

就像这样:

void DFS(int d, int c){
	if(d == n){
		if(c > ans) ans = c;
		return;
	}
	DFS(d + 1, c + w[i]);
	DFS(d + 1, c);
}

那么这一章就到此结束了。

七. 王者:听天由命

1)随机数

如果你觉得你的人品很好,可以试试这一招——输出随机数。

先看一下代码:

#include<stdlib.h>
#include<time.h>
//以上两个头文件必须加
int main() {
	srand(time(NULL)); //输出随机数前执行此语句
	printf("%d",rand() % X); //输出一个0~X-1的随机整数。
	return 0;
}

这种方法适用于输出一个整数(或判断是否)的题目中,答案的范围越小越好。让老天爷决定你的得分吧。

据说,在 \(NOIP 2013\) 中,有人 最后一题 不会,愤然打了个随机数,结果得了\(70\) 分啊!!

2)蒙的基本对

让我们来看看 这道题

发现:只有 JollyNot jolly 两种,而满足条件的几率很小,那我们就直接输出 Not jolly 就行了啊!

像这样:

#include<bits/stdc++.h>
using namespace std;
int main(){
    cout << "Not jolly";
    return 0;
}

最后竟然得了 \(50\) 分!

那么这一章就到此结束了。

八. 天神:贪心的合并

1)贪心算法

\(dp\) —— 动态规划,是一种很难的算法。你做了 \(1000\)\(dp\),第 \(1001\) 道还是不会。

考场上遇到 \(dp\) 我们要怎么做呢?

首先需要做的就是:贪心。

在这里声明:不要害怕没过样例,直接去测试就好了。

利用贪心,谁最大就用谁,最多能得到 \(30\) 分。

2)合并

我们已经学了很多骗分方法,但他们中的大多效率并不高,一般能骗 \(10 ~ 20\) 分。这不

能满足我们的骗分要求。

然而,我们可以合并骗分的程序。举个最简单的例子,有些 含有无解情况的题目,

它们同样有样例。我们可以写这个程序:

if(是样例) cout << 样例;
else cout << -1;

这样也许能变 \(10\) 分为 \(20\) 分,甚至更多。

当然,合并骗分方法时要注意,不要重复骗同一种情况,或漏考虑一些情况。

大量能骗分的问题都能用此法,大家可以试试用新方法骗 文化之旅

3) C++ 党的福利 —— STL

快速排序是一个经典算法,也是 \(C++\) 党的经典福利。他们有这样的代码:

#include<algorithm>//这是必须的
sort(A + 1, A + n + 1); //对一个下标从 1 开始存储,长度为 n 的数组升序排序

就这么简单,完成了 \(P\) 党一大堆代码干的事情。

\(C++\) 里还有一种东西,叫 \(vector\) 容器。它可以随着元素的数量而改变大小。它其实就是数组,却比数组强得多。

下面看看它的几种操作:

vector<int> v; //定义
v.push_back(x); //末尾增加一个元素x
v.pop_back(); //末尾删除一个元素
v.size(); //返回容器中的元素个数

它同样可以使用下标访问。(从 \(0\) 开始)

那这一章就介绍完了。

九. 上帝:报复性心理——死循环

至此,我已介绍完了我所知的骗分方法。如果上面的方法都不奏效,我也无能为力。但是,我还有最后一招——

有句古话说:“宁为玉碎,不为瓦全”。我们蒟蒻也应有这样的精神。骗不到分,就报复一下,卡评测以泄愤吧! 卡评测主要有两种方法:一是死循环,故意超时;二是进入终端,卡住编译器。 先介绍下第一种。代码很简单,请看:

while(1);

就是这短短一句话,就能卡住评测机长达 \(10s,20s\),甚至更多!

对于测试点多、时 限长的题目,这是个不错的方法。

第二种方法也很简单,但危害性较大,建议不要在重要比赛中使用,

否则可能让你追悔莫及。它就是:

include<con> //Windows系统中使用
include</dev/console> //Linux系统中使用

它非常强大,可以卡住评测系统,使其永远停止不了编译你的程序。

唯一的解除方法是,工作人员强行关机,重启,重测。

当然,我不保证他们不会气愤地把你的成绩变成 \(0\) 分。请慎用此方法。

十. 实战演练

下面我们来做一些习题,练习骗分技巧。

我们来一起分析一下 \(NOIP 2013\) 普及组的试题吧。

第一题

第二题

第三题

第四题

\(1\) 题,太弱了,蒟蒻都能做,不用骗,得 \(100\) 分。

\(2\) 题,数据很大,但是可以直接输入一个数,输出它 \(mod\) \(10000\) 的值。得 \(10\)分。

\(3\) 题,是一道非常基础的 \(DP\),但对于不知 \(DP\) 为何物的蒟蒻来说,就使用暴力算法(即 \(DFS\))。得 \(20\) 分。

\(4\) 题,我们可以寻找一下数据的规律,你会发现,在所有样例中,\(M\) 值即为答案。所以直接输出 \(M\),得 \(10\) 分。

这样下来,一共得 \(140\) 分,比一等分数线还高 \(20\) 分!你的信心一定会得到鼓舞的。这就是骗分的神奇。

十一. 结语

骗分是蒟蒻的有力武器,可以在比赛中骗得大量分数。

相信大家在这个博客中收获了很多,希望本帖子能帮助你多得一些分。

但是,最后我还是要说一句:

只有做到不骗分,才是最好的骗分。

posted @ 2023-07-21 16:06  So_noSlack  阅读(931)  评论(1)    收藏  举报