码迷,mamicode.com
首页 > 其他好文 > 详细

9-16考试整理

时间:2015-09-16 21:56:15      阅读:330      评论:0      收藏:0      [点我收藏+]

标签:

防线
(defender.pas/c/cpp)
题目描述
lsp 学习数学竞赛的时候受尽了同仁们的鄙视, 终于有一天„„受尽屈辱的lsp黑化成为了黑暗英雄Lord lsp。就如同中二漫画的情节一样,Lord lsp 打算毁掉这个世界。数学竞赛界
的精英lqr 打算阻止Lord lsp 的阴谋,于是她集合了一支由数学竞赛选手组成的超级行动队。由于队员们个个都智商超群,很快,行动队便来到了Lord lsp的黑暗城堡的下方。但是,同样强大的Lord lsp 在城堡周围布置了一条“不可越过”的坚固防线。防线由很多防具组成,这些防具分成了N 组。我们可以认为防线是一维的,那么每一组防具都分布
在防线的某一段上,并且同一组防具是等距离排列的。也就是说,我们可以用三个整数S,E 和D 来描述一组防具,即这一组防具布置在防线的S,S + D,S + 2D,...,S + KD(K∈Z,S + KD≤E,S + (K + 1)D>E)位置上。黑化的 Lord lsp 设计的防线极其精良。如果防线的某个位置有偶数个防具,那么这个位置就是毫无破绽的(包括这个位置一个防具也没有的情况,因为0 也是偶数)。只有有奇数个防具的位置有破绽,但是整条防线上也最多只有一个位置有奇数个防具。作为行动队的队长,lqr 要找到防线的破绽以策划下一步的行动。但是,由于防具的数量太多,她实在是不能看出哪里有破绽。作为lqr 可以信任的学弟学妹们,你们要帮助她解决这个问题。
输入格式
输入文件的第一行是一个整数T,表示有T 组互相独立的测试数据。
每组数据的第一行是一个整数 N。
之后 N 行,每行三个整数Si,Ei,Di,代表第i 组防具的三个参数。
输出格式
对于每组测试数据,如果防线没有破绽,即所有的位置都有偶数个防具,输出一行
“There’s no weakness.”(不包含引号)
否则在一行内输出两个空格分隔的整数 P 和C,表示在位置P 有C 个防具。当然C 应
该是一个奇数。
样例输入
3
2
1 10 1
2 10 1
2
1 10 1
1 10 1
4
1 10 1
4 4 1
1 5 1
6 10 1
样例输出
1 1
There’s no weakness.
4 3
数据范围与约定
对于30% 的数据,满足防具总数不多于107。
对于 100% 的数据,满足防具总数不多于108,Si≤Ei,1≤T≤5,N≤200000,0≤Si,
Ei,Di≤231-1。

 


星象仪
(pla.pas/c/cpp)
题目描述
在寂寞的夜里,星象仪是非常浪漫的东西。但是,你作为一个精神稍微有点不太正常的Geek,把原本正常的星象仪改造得像电报发送器一样。当然,你这个的构造还要更加奇葩一点。具体来说,你的星象仪是一棵满二叉树,二叉树的节点都是有两个输入端和一个输出端的AND 门或者OR 门。它们输入和输出的信号都是只是0 或者1。它们会接受子节点的输出信号,然后将这两个信号进行AND 运算或者OR 运算作为自己的输出。然后,根节点的输出信号就是整个星象仪的输出信号。叶节点的输入信号是由你来调整的,如果二叉树有K 层,那么你显然有2K 个输入信号可以调整。调整一次当然只能改变一个输入信号。如左图所示,这就是一台你改造过之后的星象仪。根据你的设定,在一开始所有的输入端的输入信号都是0。现在你希望用星象仪得到一串信号,为此,你需要不停地调整输
入。假定你想要用左图中的星象仪得到输出信号000111,一种可行的方案是0001→0011→1100→1111→1010→0101,但是这样你要调整14 次输入信号。更加方便的方式是0000→
0000→0000→0101→0101→0101,这样你总计只需要调整2次输入信号。由于调整输入信号是一件非常麻烦的事情,现在你希望知道对于一台给定的星象仪,如果想要得到一串给定的信号,至少需要调整多少次输入。
输入格式
输入文件包含多组测试数据。第一行有一个整数T,表示测试数据的组数。
测试数据的第一行是一个正整数 N,表示输入信号的数目。保证N 是2 的整数次幂。
第二行含有一个由 0 和1 组成的字符串S,表示你想要得到的信号。
第三行包含 N – 1 个整数,按照层次遍历顺序给出满二叉树的每个节点。整数只会是0
或者1。0 表示二叉树的这个位置是一个OR 门,1 表示是一个AND 门。
输出格式
对于每组测试数据,在单独的一行内输出结果。
样例输入
2
4
010101
0 0 0
4
111111
1 1 1
样例输出
5
4
数据范围与约定
对于30% 的数据,N≤16,S 的长度在100 之内。
对于 100% 的数据,T≤100,N≤8192,S 的长度在10000 之内。

 


分形之城
(fra.pas/c/cpp)
题目描述
城市的规划在城市建设中是个大问题。不幸的是,很多城市在开始建设的时候并没有很好的规划,城市规模扩大之后规划不合理的问题就开始显现。而这座名为Fractal 的城市设想了这样的一个规划方案,如下图所示:

技术分享
当城区规模扩大之后,Fractal 的解决方案是把和原来城区结构一样的区域按照图中的方式建设在城市周围,提升城市的等级。对于任意等级的城市,我们把正方形街区从左上角开
始按照道路标号。虽然这个方案很烂,Fractal 规划部门的人员还是想知道,如果城市发展到了等级N,编号为A 和B 的两个街区的直线距离是多少。街区的距离指的是街区的中心点之间的距离,每个街区都是边长为10 米的正方形。
输入格式
输入文件包含多组测试数据,第一行有一个整数T 表示测试数据的数目。
每组测试数据包含一行三个整数 N, A, B,表示城市等级以及两个街区的编号。
输出格式
对于每组测试数据,在单独的一行内输出答案,四舍五入到整数。
样例输入
3
1 1 2
2 16 1
3 4 33
样例输出
10
30
50
数据范围与约定
对于30% 的数据,N≤5,T≤10。
对于 100% 的数据,N≤31,1≤A,B≤2^2N。T≤1000。

 

 

第一题:二分,如果前一半的防具数是0,那么表明漏洞在前一部分,否则在后一部分

第二题:很明显这是一个堆,从下往上搞,遇到and求子节点和,遇到or求子节点最小值,得到修改0—>1最小值,之后每次修改只需要改一个就行了,贪心正确性显然,不多证了

第三题:四分= =,把原图分成四部分,再对每部分分别分成四部分,一边分一边记,最后求出两个相对坐标勾股定理。

代码:

var
        s,d,e:array[0..200200] of longint;
        t,n,l,w,r,_,o,i,j:longint;
        z:int64;

        function f(x:int64):longint;
        var i:longint;
        begin
                _:=0;
                for i:=0 to n-1 do
                begin
                        if e[i]<x then
                        inc(_,((e[i]-s[i]) div d[i])+1)
                        else if s[i]<x then
                        inc(_,((x-1-s[i]) div d[i])+1);
                end;
                exit(_);
        end;


        begin
                assign(input,defender.in);
                reset(input);
                assign(output,defender.out);
                rewrite(output);
                readln(t);
                for w:=1 to t do
                begin
                        z:=0;
                        o:=0;
                        readln(n);
                        for i:=0 to n-1 do
                        begin
                                read(s[i],e[i],d[i]);
                                o:=o xor (((e[i]-s[i]) div d[i])+1);
                        end;

                        if (((not o) and 1)<>0) then writeln(There,‘‘,s no weakness.)
                        else
                        begin
                                i:=1<<30;
                                while i<>0 do
                                begin
                                        if (((not f(z+i)) and 1)<>0) then
                                        z:=z+i;
                                        i:=i div 2;
                                end;
                                writeln(z, ,f(z+1)-f(z));
                        end;
                end;
                close(output);
                close(input);  
        end.
var
        a,f:array[0..100000] of longint;
        ss:ansistring;
        s:array[0..200000] of char;
        t,n,v,z,i,w:longint;

        function min(a,b:longint):longint;
        begin if a<b then exit(a) else exit(b); end;

        begin
                assign(input,pla.in);
                reset(input);
                assigN(output,pla.out);
                rewrite(output);
                readln(t);
                for w:=1 to t do
                begin
                        readln(n);
                        z:=0;
                        v:=0;
                        readln(ss);
                        for i:=1 to length(ss) do s[i]:=ss[i];
                        s[0]:=0;
                        for i:=1 to n-1 do
                        read(a[i]);

                        for i:=n to 2*n-1 do
                        f[i]:=1;

                        for i:=n-1 downto 1 do
                        if a[i]<>0 then f[i]:=f[i*2]+f[i*2+1]
                        else f[i]:=min(f[i*2],f[i*2+1]);

                        for i:=1 to length(ss) do
                        if s[i]<>s[i-1] then
                        if v<>0 then inc(z) else begin v:=1; inc(z,f[1]); end;

                        writeln(z);
                end;
                close(input);
                close(output); 
        end.
type
        pair=record
        first,second:int64;
        end;

var

        n,j,h,dx,dy,o:int64;
        kase,i:longint;
        hp,op:pair;

        procedure swap(var a,b:int64);
        var t:int64;
        begin
                t:=a;
                a:=b;
                b:=t;
        end;

        function recur(stage:longint; id:int64):pair;
        var
                max,z,s,idsp:int64;
                psp:pair;
        begin
                if stage=0 then begin psp.first:=0; psp.second:=0; exit(psp); end;
                max:=1<<(stage-1);
                s:=max*max;
                z:=id div s;
                idsp:=id mod s;
                psp:=recur(stage-1,idsp);
                if (z=0) or (z=3) then swap(psp.first,psp.second);
                if z=3 then
                begin
                        psp.first:=max-psp.first-1;
                        psp.second:=max-psp.second-1;
                end;

                if (z=1) or (z=2) then psp.first:=psp.first+max;
                if (z=3) or (z=2) then psp.second:=psp.second+max;
                exit(psp);
        end;

        begin
                assign(input,fra.in);
                reset(input);
                assigN(output,fra.out);
                rewrite(output);
                read(kase);
                for kase:=1 to kase do
                begin
                        readln(n,h,o);
                        hp:=recur(n,h-1);
                        op:=recur(n,o-1);
                        dx:=abs(hp.first-op.first);
                        dy:=abs(hp.second-op.second);
                        writeln(round(sqrt(dx*dx+dy*dy)*10));
                end;
                close(input);
                close(output); 
        end.

就是这样= =

喜欢就收藏一下,vic私人qq:1064864324,加我一起讨论问题,一起进步^-^

9-16考试整理

标签:

原文地址:http://www.cnblogs.com/victorslave/p/4814529.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!