如何造数据——分分钟变成造数据大师

如何造数据


很多人将造数据看成小儿科,但并不是这样的,往往造数据要思考的甚至比写代码要思考的多了多。
下面让我简单的介绍一下:

基本的随机代码

先来看随机造数的函数。
C++:

//需要用到的库
#include<cstdlib>
#include<windows.h>
srand()//初始化(放在程序开头),如果不初始化,生出来的东西是一样的
srand(time(0))//较慢的初始化,要调ctime库
srand(GetTickCount())//毫秒级初始化(反正就是快),要调windows.h库
rand()//生成一个short int类型的非负整数
//如果要生成int类型的数就得写个函数
int brand(){
    return (rand()<<15)+(rand()<<1)+(rand()&1);
}
//这样就好了

pascal:

randomize;//初始化(很快,放在程序开头)
random(x)//生成一个0到x-1的整数

本人只会这两种语言。。。

树形结构的构造

造数据时,树形结构是十分麻烦的,如果你想生成一棵树,如果纯随机的话,经常生出一个环来。所以这时候就要思考了。

1.我们根据树的定义,知道每个节点当且仅有一个父节点,那么我们就为每个节点选一个父节点,然后建图,完美解决。

2.我们学过Kruskal,知道它的原理,就是从最小的开始,看两端点是否连通,不连通就连上。我们可以根据这个方法,先胡乱造一通,劲量多造,然后打乱(其实也可以不打乱,因为本身就是乱的),然后用并查集,将无用的边删去。最后还需要check一趟,因为你不能保证刚好是一个连通块,经常出现多个的情况,所以有意的加入几条边,整体还是随机的。

方法还有很多,或许大佬们还有更好的想法。

一个难造的造数据(题目)

下面给你们一道小题(同学出的),你可以尝试去造,但是,我是造(tai)不(lan)来(le)的。

接电路
(electricity.pas/c/cpp)
【题目背景】
这次,ZYK和WLW正在进行电学实验,ZYK装逼气焰十分嚣张,出了难题考考WLW
【题目描述】
在WLW和ZYK的试验中,一共有N(1≤N≤79)种型号的用电器,每种用电器的个数无限多
ZYK与WLW不屑于简单的并联、串联电路,他们常常会尝试复杂的混联电路!
但是这些用电器质量不过关,每一个用电器都有P的可能断路(0≤P≤1)
假若表示一个简单的混联电路,是这样的:
这里写图片描述
ZYK果断嫌太烦,于是WLW改进了表示方法,上面这个电路,可以这样表示:
A,(B)(C)(D)
下面解释一下:
1.一个元件是最小的电路,最多有79种用电器,分别用字符0到字符~(ASCII码从48到126一共79个,放心,这些关键字符号(,)肯定不在那里面)
2.K个电路组成的串联电路表示为电路1,电路2,……,电路K
3.K个电路组成的并联电路表示为(电路1)(电路2)……(电路K)
【任务】
现在ZYK想让WLW求出电源两端断路的概率
【输入格式】
第1行是一个整数N,表示用电器型号总数
第2行是一个表示电路的字符串,如题目描述所示
接下来n行,每行一个字符C(0到~)和一个实数P(小数点后最多6位小数),中间用一个空格隔开,P表示对应用电器C断路的概率,数据保证C各不相同
【输出格式】
一行一个实数N,表示电源两端断路的概率,四舍五入保留6位小数
【样例输入】
5
(A,B)((C)(D),E)
A 0.2
B 0.3
C 0.4
D 0.5
E 0.6
【样例输出】
0.299200
【数据范围】
对于9%的数据:N≤10,且全部为数字,电路字符串长度≤40
对于27%的数据:N≤26,且全部为大写字母,电路字符串长度≤200
对于54%的数据:N≤52,且全部为大小写字母,电路字符串长度≤3000
对于81%的数据:N≤79,电路字符串长度≤80000
对于100%的数据:N≤79,电路字符串长度≤1000000
【注释】
本题不开-O2编译优化
时间限制:1秒
空间限制:64MB

其实这个可以用DFS构造,但是由于注意事项太多,本人懒的码代码。

反例的构造

造反例,有时是很容易的,但是数据一大,你就很难把控,特别是图论的题目,很有可能会绕过你专门造的路线。所以,当遇到这种题目时,多造几组对拍一下。
造反例还需要思考很多东西,因为有些代码是根据题目描述,猜出数据方向而写的。
有些题目,像NOIP2017第三题,数据太弱了,弱到写个从左上角到右下角的DP都能拿95分,想这种DP,随便造一个回路就可以放倒,除非是N次DP,结果,就一个点放倒了,这就是出题人没考虑到,或者太(tai)懒(cai)了(le),懒(cai)到抠脚。
所以说,每当造数据时,一定要思考往哪个方向造数据,尽量不要让人骗分骗到手。
造反例有一个很好有的方法,就是对拍,拍它个一个小时,反例就到手了(但是没有好的代码,可能永远也停不了)。
对拍是用批处理写的

:loop
maker//造数据
a.exe//标程(.exe可以不写)
b.exe//有反例的程序或可能有反例的程序
fc a.out b.out//比较输出文件
if errorlevel==1 pause//如果不同,就停止
goto loop//继续

对拍拍停了,那么反例就出来了。在比赛中很好用,有了新想法,和笨蛋对拍一下,就知道大致是否有问题。然后,跟着数据模拟,三下两下错误就找到了。

如何造出最坏的数据

就举个例子吧,比如像是区间类的题目,just like区间求最大值(其实这个很简单,只是举个例子)。

对于Q次询问L,R(1≤L≤R≤N)。
输出L到R区间的最大值。

这种数据构造很简单:

for(int i=1;i<=Q;i++){
    int L=rand()%N,R=rand()%N;
    if(R<L) swap(L,R);
    printf("%d %d\n",L,R);
}

有人会写O(N^2)的扫描

for(int i=1;i<=Q;i++){
    int L=read(),R=read();//读入
    ans=0;
    for(int j=L;j<=R;j++) ans=max(ans,a[j]);
    printf("%d\n",ans);
}

然而,(理论估计)当数据N,Q上到10^4时就不行了。但是,你会发现,这种笨蛋照样能杀满。
因为询问的边界L和R是随机给的,区间跨度有可能很小,时间也就上不到O(N*Q)。
所以当这种情况,我们需要限制一个边界的跨度,比如5*10^3,因为如果都是1到N的话很容易被人猜中。

for(int i=1;i<=Q;i++){
    int L=rand()%N,R=rand()%N;
    if(R<L) swap(L,R);
    while(R-L<5000){
        L=rand()%N,R=rand()%N
        if(R<L) swap(L,R);
    }
    printf("%d %d\n",L,R);
}

只是举个例子,像这种情况还有很多,题目也不少,这里就不一一介绍了。

喜欢就加个关注吧!
  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
电子技术基础课程设计报告 定 时 闹 钟 2014年12月24日 摘要 本设计是一个定时闹钟,它仅使用单片的40引脚单片机完成闹钟的全部功能。设计目 的是为了学习和巩固单片机知识,使对已学过的基础知识能有更深入的理解,学会独立 思考、独立思考、独立工作,以及提高对所学应用基本理论析和解决实际问题的能力 。 本文设计的定时闹钟采用80c51芯片,用汇编语言进行编程,时、、秒用6位LED数 码管显示。在电路中通过四个按键S1、S2、S3和S4来进行定时和调时,定时时间到通过 喇叭发出报警声。 设计系统的主要功能 · 能显示 时时--秒秒。 · 能够设置定时时间、 修改定时时间。 · 到定时时间能发出报警 1 系统总体方案及硬件设计 1.1 系统总体方案 1)由于要显示数字时间,所以需要6位数码管。 2)时间的定时用时钟电路,修改时间和定时用手动按键控制,报警声通过喇叭发出 。 3)80c51单片机加上外围器件(2个3位共阳数码管,8个限流电阻和一个蜂鸣器)和 应用程序(ISIS 7 Professional软件和KEIL编译软件),构成相应的应用系统。 1.2系统设计方框图 1.3硬件设计 1.3.1芯片:80c51 80c51芯片内不包含一个8位中央处理器cpu,4kb程序存储器ROM,128B随机存取存储器 ,RAM,4个8位并行I/O接口,1个全双工串行通信接口,2个16 位定时器、计数器级及21个特殊功能寄存器。 由先进CMOS 工艺制并带有非易失性Flash 程序存储器 全部支持12 时钟和6 时钟操作 P89C51X2 和P89C52X2/54X2/58X2 别包含128 字节和256 字节RAM 32 条I/O 口线 3 个16 位定时/计数器 6 输入4 优先级嵌套中断结构 1 个串行I/O 口 可用于多机通信 I/O 扩展或全双工UART以及片内振荡器和时钟电路。此外,由于器件采用了静态设计,可提 供很宽的操作频率范围,频率可降至0 。可实现两个由软件选择的节电模式,空闲模式和掉电模式,空闲模式冻结CPU但RAM定 时器,串口和中断系统仍然工作掉电模式保存RAM的内容 但是冻结振荡器 导致所有其它的片内功能停止工作。由于设计是静态的时钟可停止而不会丢失用户数据 运行可从时钟停止处恢复。 .1.3.2蜂鸣器 由P3.7口控制蜂鸣器,使其定时时间到能发出报警声。 1.3.3时钟电路 单片机的时钟产生方法有两种:内部时钟方式和外部时钟方式。本系统中单片机采用 内部时钟方式。最常用的内部时钟方式是采用外接晶体和电容组成的并联谐振回路。振 荡晶体可在1.2MHz~12MHz之间。电容值无严格要求,但电容取值对振荡频率输出的稳定 性、大小和振荡电路起振速度有少许影响,一般可在20pF~100pF之间取值。 单片机的时钟电路:如图所示 限流电阻:8个10k电阻 控制按键:本系统要进行时间的调整和定时,因此用4个手动按键对其进行控制。 1.3.4显示器模块的设计 利用2个七段数码管6个选位引脚连接C51单片机 P2.5 –P2.0接口,其他8个引脚别通过限流电阻与C51单片机的P0.0 - P0.7和共阳极数码管连接。 数码管: 单片机中通常使用7段LED,LED是发光二极管显示器的缩写。LED显示器由于结构简单 ,价格便宜,体积小,亮度高,电压低,可靠性高,寿命长,响应速度快,颜色鲜艳, 配置灵活,与单片机接口方便而得到广泛应用。LED显示器是由若干个发光二极管组成显 示字段的显示部件,当发光二极管导通时,相应的一个点或一个笔划发光,控制不同组 合的二极管导通,就能显示出各种字符。 如图所示 2软件设计 2.1划模块 根据设计要求,定时闹钟程序可为以下几个模块: 1)显示时间的设置; 2)闹钟时间的设置: 4)定时时间的响应。 3.2程序流程图 程序流程图 2.3汇编程序 ORG 0000H LJMP START ORG 000BH LJMP TIME ;;;;;;;;初始化;;;;;;;; START: MOV SP, #50H MOV 20H,#00H ;定义秒 MOV 21H,#00H ;定义 MOV 22H,#00H ;定义时 MOV 23H,#01H ;定义闹钟分钟 MOV 24H,#01H ;定义闹钟小时 MOV 25H,#00H MOV 26H,#01H MOV 30H,#00H ;BCD SECOND MOV 31H,#00H MOV 32H,#00H ;BCD MINUTE MOV 33H,#00H MOV 34H,#00H ;BCD HOUR MOV 35H,#00H MOV 36H,#01H MOV 37H,#00H MOV 38H,#01H MOV 39H,#00H MOV 50H,

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值