How to 对拍?

Posted ljc20020730

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了How to 对拍?相关的知识,希望对你有一定的参考价值。

对拍从数学的统计学角度来说是一个好的方法,至少能在你竞赛中帮你拿回一些分
--yzr大牛
pas的对拍一开始还没写过,突然想学一下对拍。
那么就学吧。
dp水题(搜索):https://www.luogu.org/problem/show?pid=1164
【题目名称】 小A点菜
【题目背景】
uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种。
uim指着墙上的价目表(太低级了没有菜单),说:“随便点”。
【题目描述】
不过uim由于买了一些辅(e)辅(ro)书,口袋里只剩M元(M<=10000)。
餐馆虽低端,但是菜品种类不少,有N种(N<=100),第i种卖ai元(ai<=1000)。由于是很低端的餐馆,所以每种菜只有一份。
小A奉行“不把钱吃光不罢休”,所以他点单一定刚好吧uim身上所有钱花完。他想知道有多少种点菜方法。
由于小A肚子太饿,所以最多只能等待1秒。
【输入输出格式】
输入格式:
第一行是两个数字,表示N和M。
第二行起N个正数ai(可以有相同的数字,每个数字均在1000以内)。
输出格式:
一个正整数,表示点菜方案数。
【输入输出样例】
输入样例#1:
4 4
1 1 2 2
输出样例#1:
3
这是暴力程序dfs:(dfs)

var a:array[1..100000] of longint;
u:array[1..100000] of boolean;
n,m,i,ans:longint;
procedure dfs(k,s:longint);
var i:longint;
begin
if (s>=m)or(k=n) then begin
if s=m then inc(ans); exit;
end;
for i:=k+1 to n do begin
if a[i]>m-s then exit;
if u[i]=false then begin
u[i]:=true;
dfs(i,s+a[i]);
u[i]:=false;
end;
end;
end;
procedure qsort(l,r:longint);
var
i,j,mid,p:longint;
begin
i:=l;
j:=r;
mid:=a[(l+r) div 2];
repeat
while a[i]<mid do inc(i);
while a[j]>mid do dec(j);
if i<=j then begin
p:=a[i]; a[i]:=a[j]; a[j]:=p;
inc(i);
dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end;
begin
assign(input,\'in.txt\');
assign(output,\'out.txt\');
reset(input);
rewrite(output);
readln(n,m);
fillchar(u,sizeof(u),false);
for i:=1 to n do read(a[i]);
qsort(1,n);
fillchar(u,sizeof(u),false);
dfs(0,0);
writeln(ans);
close(input);
close(output);
end.

 

这是dp程序:(dp)

var j,n,m,i:longint;
f,v:array[0..100000]of longint;
begin
assign(input,\'in.txt\');
assign(output,\'out.txt\');
reset(input);
rewrite(output);
readln(n,m);
f[0]:=1;
for i:=1 to n do read(v[i]);
for i:=1 to n do
for j:=m downto v[i] do
f[j]:=f[j]+f[j-v[i]];
writeln(f[m]);
close(input);
close(output);
end.
此外我们呢还需要写一个数据生成的程序(maker)
var n,m,i:longint;
begin
assign(output,\'in.txt\');
rewrite(output);
randomize;
n:=random(101);
m:=random(10001);
writeln(n,\' \',m);
for i:=1 to n do write(random(1001),\' \');
writeln;
close(output);
end.

然后写一个可以重复利用的批处理文件(duipai.bat)

:loop
maker.exe
dfs.exe
dp.exe
fc outljc.txt outstd.txt
if errorlevel 1 goto end
goto loop
:end

这是DOS语言,意思差不多是这样的:

loop//循环
maker.exe//运行 数据生成器
dfs.exe//运行 正确程序
dp.exe//运行 待检测程序
fc o1.txt o2.txt//比较 两个程序的输出结果
if errorlevel 1 goto end//如果 有错误(两个输出文件不一样) 就跳到end
goto loop//跳到loop
:end

然后你就可以继续写下面的题了,不用管他了,
如果等你下一题写好了,还没有退出的话就说明你的程序基本真确:

正在比较文件out.txt 和OUT.TXT
PC:找不到差异

可以参考有图有真相的http://www.cnblogs.com/yangqingli/p/4928174.html

以上是关于How to 对拍?的主要内容,如果未能解决你的问题,请参考以下文章

How to Write Go Code

什么是 android studio 中的片段活动?

如何 debug nodeJS 代码? how to inspect NodeJS code?

Yii2 HOW-TO:最佳实践

[How to] 使用HBase协处理器---Endpoint客户端代码的实现

How to Make Fibonacci Confusing