zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    列表导航栏实例(01)
    点阵图形的高效旋转算法
    7种健康食物助抗初秋干燥
    打造自己的reset.css
    如何点击链接直接跳转到app store指定应用下载页面
    【iOSiap防护】验证用户付费收据!拒绝iap Cracker!拒绝iap Free!让iphone越狱用户无从下手!【2012年5月2日更新防护iap Free的方法】
    如何自定义协议从自己的一个app打开另一个app
    传统网站与Web标准——DIV+CSS布局实例
    ANSI、Unicode、Unicode big endian、UTF8编码
    良好的XHTML规则
  • 原文地址:https://www.cnblogs.com/ljc20020730/p/7389147.html
Copyright © 2011-2022 走看看