2016.06.11下午【2016新初一 】普及组模拟题解

来源:互联网 发布:java 读取csv 编辑:程序博客网 时间:2024/05/05 13:18

题目网址:http://blog.csdn.net/fengyingjie2/article/details/51711179

----------------------------------------------------------------------------------------------------------

总结:

     这次比赛总体来说考得挺好,题目也挺简单,第二题没看懂题目所以没做,不然有可能AK了! 

T1:

     这道题看起来我有点懵逼,他说除掉多余的0,我刚开始以为是0就得除掉,于是差点错了。其实这个就是高精度,普普通通的高精度乘法,找好位置加就好。我的高精度可能和书本不同,可能会更好理解。贴代码:

<span style="font-size:14px;">var        s1,s2:string;        num,a,b:array[0..90] of longint;        i,j,len1,len2:longint;begin        assign(input,'bullmath.in');reset(input);        assign(output,'bullmath.out');rewrite(output);        readln(s1);        len1:=length(s1);        readln(s2);        len2:=length(s2);        for i:=1 to len1 do                a[len1-i+1]:=ord(s1[i])-48;        for i:=1 to length(s2) do                b[len2-i+1]:=ord(s2[i])-48;//输入处理        for i:=1 to len1 do                for j:=1 to len2 do                        inc(num[i+j-1],a[i]*b[j]);//累加每两个在这个位置相乘的数,        for i:=1 to len1+len2-1 do        begin                inc(num[i+1],num[i] div 10);//累加给上一位                num[i]:=num[i] mod 10;//剩下个位        end;        if num[len1+len2]>0 then write(num[len1+len2]);//特殊情况判断        for i:=len1+len2-1 downto 1 do                write(num[i]);//输出        close(input);close(output);end.</span>
T2:

     第二题有点难度。我比赛看不懂题目,其实题目也很好理解,就是找通过每块板的距离来找板与板之间最短距离。于是乎,我们可以枚举最短距离。不过最短距离的最大值为a[n]-a[1],就是1,000,000,000,还没有加判断,绝对超时。所以,我们就用二分来判断。效率为log²N,节省了非常多的时间。上代码:

<span style="font-size:14px;">var        l,r,i,mid,n,m,min:longint;        a:array[0..100000] of longint;procedure q(l,r:longint);var    i,j,m,p:longint;begin    i:=l;    j:=r;    m:=a[(l+r) div 2];    repeat        while a[i]<m do inc(i);        while a[j]>m 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 q(l,j);    if i<r then q(i,r);end;function pd(xx:longint):longint;//这个判断就是用来判断按照二分的最短距离能够用多少块板var        i,ans,num:longint;begin        ans:=1;        num:=a[1];//第一个为第一块板,ans=1同,就是第一块板已经算选了1个。        for i:=1 to n do        if a[i]-num>=xx then//两两的差大于等于二分的距离就说明可以在下一个地方加板。        begin                inc(ans);//加板                num:=a[i];//记录当前板的位置                if ans=m then                        exit(ans);//如果符合条件不需要枚举,直接退出        end;        exit(0);end;begin        assign(input,'aggr.in');reset(input);        assign(output,'aggr.out');rewrite(output);        readln(n,m);        for i:=1 to n do                read(a[i]);        q(1,n);//先排序,不是有序的就不可以算出来两两之间的距离了。</span>
<span style="font-size:14px;">        l:=0;//可以省略        r:=(a[n]-a[1]) div m+1;        while l<=r do        begin                mid:=(l+r) div 2;                if pd(mid)=m then                begin                        min:=mid;                        l:=mid+1;                end                else                        r:=mid-1;        end;        writeln(min);        close(input);close(output);end.</span>
T3:第三题太水了,把处理过的赋值过的位置变成反之的符号就可以了,dfs or bfs。

<span style="font-size:14px;">var        n,m,i,j,k,ans,head,tail,x,y:longint;        a:array[1..100,1..100] of char;        dx:array[1..8] of longint=(-1,-1,0,1,1,1,0,-1);        dy:array[1..8] of longint=(0,1,1,1,0,-1,-1,-1);        d:array[1..15000,1..2] of longint;begin        assign(input,'lkcount.in');reset(input);        assign(output,'lkcount.out');rewrite(output);        readln(n,m);        for i:=1 to n do        begin                for j:=1 to m do                        read(a[i,j]);                readln;        end;        for i:=1 to n do                for j:=1 to m do                        if a[i,j]='W' then                        begin                                inc(ans);                                head:=0;                                tail:=1;                                d[1,1]:=i;                                d[1,2]:=j;                                while head<>taIL DO                                begin                                        inc(head);                                        for k:=1 to 8 do                                        begin                                                x:=d[head,1]+dx[k];                                                y:=d[head,2]+dy[k];                                                if (x>0)and(y>0)and(x<=n)and(y<=m)and(a[x,y]='W') then                                                begin                                                        inc(tail);                                                        d[tail,1]:=x;                                                        d[tail,2]:=y;                                                        a[x,y]:='.';                                                end;                                        end;                                end;                        end;        writeln(ans);        close(input);close(output);end.</span>
T4:第四题我在考试随便打了个DP居然对了!!!欢呼~╰(*°▽°*)╯喜悦~。这个目测就是搜索,不过我搜索打不对。就是有2种方案,走还是接,然后计算最大值。不过正解还是DP。同样也是2种情况,走还是接。f[i,j]表示第I分钟移动了J次接到的最大苹果数。动态转移方程为:f[i,j]:=max(f[i-1,j]+k1,f[i-1,j-1]+k2);k1,k2表示可不可以接到苹果,接到为1,反之为0。

<span style="font-size:14px;">var        n,m,i,j,k1,k2,now,max1:longint;        f:array[0..1000,0..30] of longint;        a:arrAY[0..1000] of longint;function min(a,b:longint):longint;begin        if a<b then exit(a) else exit(b);end;function max(a,b:longint):longint;begin        if a>b then exit(a) else exit(b);end;begin        assign(input,'bcatch.in');reset(input);        assign(output,'bcatch.out');rewrite(output);        readln(n,m);        for i:=1 to n do        begin                readln(a[i]);                if a[i]=1 then f[i,0]:=f[i-1,0]+1 else f[i,0]:=f[i-1,0];        end;        for i:=1 to n do                for j:=1 to min(m,i) do                begin                        k1:=0;                        k2:=0;                        if odd(j) then now:=2 else now:=1;                        if now=a[i] then k1:=1 else k2:=1;                        f[i,j]:=max(f[i-1,j]+k1,f[i-1,j-1]+k2);                end;        writeln(f[n,m]);        close(input);close(output);end.</span>



0 0
原创粉丝点击