2016.08.19【初中部 NOIP普及组 】模拟赛

版权声明:转载请注明出处及原文链接,谢谢。 https://blog.csdn.net/jz_terry/article/details/52251987

这次比赛我们C组的有点翻车的感觉,都被许多蒟蒻超了过去~~


主要是第一题坑我几何不好,其他题目都发挥算比较正常吧 ORZ~


第一题很明显一个智障的几何问题,具体怎么做,我想连我都懂了大家不会不懂吧?实在不懂就去看看小地球吧


第二题第三题是爆搜


至于第四题,听说正解是状压DP,但是我用我的爆搜加一个小小的剪枝都过了,而且还比状压DP跑得快,具体我是怎么做的呢?首先,需要一个时间超限40分的爆搜程序,在深搜的前面加上一条语句:  if s+(n-y)*mina>=min then exit;  s表示当前的值,n表示有n个人,y表示当前已经传递了y个人,mina表示输入二维数组的最小值,这条语句的意思就是说:如果当前的值+剩下数的值和(我们可以假设剩下数都是最优的最小值)还要大于最小值就退出


宇林神犇这题是用dfs错误的记忆化,由于数据水所以过了,而我的答案肯定是对的,而且还比他跑得快


第四题参考代码:

var     n,i,j,min,mina:longint;
        a:array[1..16,1..16]of longint;
        b:array[1..16]of longint;
procedure dfs(x,y,s:longint);
var     i:longint;
begin
        if s+(n-y)*mina>=min then exit;
        if y=n then
        begin
                min:=s;
                exit;
        end;
        for i:=1 to n do
                if b[i]=0 then
                begin
                        b[i]:=1;
                        dfs(i,y+1,s+a[x,i]);
                        b[i]:=0;
                end;
end;
begin
        readln(n);
        mina:=maxlongint;
        for i:=1 to n do
                for j:=1 to n do
                begin
                        read(a[i,j]);
                        if (a[i,j]<>-1)and(a[i,j]<mina)then mina:=a[i,j];
                end;
        min:=maxlongint;
        for i:=1 to n do
        begin
                fillchar(b,sizeof(b),0);
                b[i]:=1;
                dfs(i,1,0);
        end;
        writeln(min);
end.

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页