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

  • 相关阅读:
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第4章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第3章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第1,2章 读书笔记(待更新)
    Tkinter的Message组件
    Git 实操/配置/实践
    mysq5.7.32-win安装步骤
    行为型模式之模板方法
    结构型模式之组合模式
    结构型模式之享元模式
    结构型模式之外观模式
  • 原文地址:https://www.cnblogs.com/ljc20020730/p/7389147.html
Copyright © 2011-2022 走看看