91 条题解

  • 1
    @ 2010-07-23 21:00:26

    狂骂出题人!!!!!!!

    题目描述不清

    还不如用图来说,!!!!!

    1 0  1  0 ————————第0层

         \  /   \  /

          10    10 ————————第1层

          \    /

           1010   —————第2层

  • 1
    @ 2010-07-04 16:39:24

    看似简单的题没想到这么阴人,害我哇了5次!

    这个故事告诉我们:

    1.注意注释(树是倒着长的,具体看下面的)。

    2.d和u可能远远超过树的高度。

    3.出题的人太阴了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

  • 0
    @ 2017-07-06 20:39:34
    #include<iostream>
    #include<string>
    #include<cmath>
    using namespace std;
    int n,u,d,ans=0;
    string s,zero="0",one="1";
    void check(string s)
    {
        if(s.find(one)==s.npos) ans+=5;
        else if(s.find(zero)==s.npos) ans+=2;
        else ans++;
    }
    void dfs(string s,int len,int floor)
    {
        if(floor>=d&&floor<=u) check(s);
        if(floor<d||len==1) return;
        dfs(s.substr(0,len/2),len/2,floor-1);
        dfs(s.substr(len/2,len/2),len/2,floor-1);
    }
    int main()
    {
        scanf("%d%d%d",&n,&u,&d);
        cin>>s;
        dfs(s,pow(2.0,n),n);
        printf("%d\n",ans);
        return 0;
    }
    
  • 0
    @ 2015-03-29 21:08:23

    第0层是啥,出题人家的树怎么哪边高哪边低都分不清楚.

  • 0
    @ 2015-03-29 21:07:23

    #include<iostream>
    #include<math.h>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<time.h>
    #include<stdlib.h>
    using namespace std;
    int ans = 0;
    int h, l;
    int size;
    char a[66600];
    int go(int from, int to){
    int kind;
    if (from == to){
    if (a[from] == '0')
    kind = 5;
    else
    kind = 2;
    }
    else{
    int mid = ((to + from) >> 1);
    int left = go(from, mid);
    int right = go(mid + 1, to);
    if (left == 5 && right == 5)
    kind = 5;
    else if (left == 2 && right == 2)
    kind = 2;
    else
    kind = 1;
    }
    int len = to - from+1;
    int ceng = log2(len);
    //ceng = size - ceng;
    if (ceng <= h&&ceng >= l)ans += kind;
    return kind;
    }
    int main(){
    freopen("in.txt", "r", stdin);
    cin >> size;
    cin >> h >> l;
    cin >> a;
    go(0, (1 << size) - 1);
    cout << ans << endl;
    return 0;
    }

  • 0
    @ 2012-07-21 20:38:40

    原来不只有自己被阴了......

    FBI树+判断,小心高度的阴人,不用建树,直接在字符串中搜索‘0’,‘1’字串的位置递归搞定

  • 0
    @ 2012-07-12 11:57:56

    根本就是FBI树 变了个形.....高度略坑爹 加个判断 剩下水掉就好了

  • 0
    @ 2009-11-05 18:57:34

    这种说的不严谨,,,样例糊弄人的题目,,,,,你要知道,,,,这个树的层可能是上面也可能是下面,,如果你wa了...就把这个树倒过来算第几层吧...上帝保佑你..

  • 0
    @ 2009-11-04 19:03:45

    一直忘了把s开成按ansistring -.-

    Accepted 有效得分:100 有效耗时:0ms

  • 0
    @ 2009-11-03 19:28:06

    觉得 往下五楼 有点问题。

    应该是 : sum:= 1+ ord(pos('1',s)=0) + ord(pos('0',s)=0)*4;

    program packfruit;

    var

    n,high,low,i,j:longint;

    s:ansistring;

    function found(s:ansistring;h:longint) :longint;

    var

    l,sum:longint;

    begin

    if hhigh then sum:=0

    else sum:= 1+ ord(pos('1',s)=0) + ord(pos('0',s)=0)*4; //此处

    l:= length(s) div 2;

    if l>=1 then

    sum:= sum + found(copy(s,1,l),h-1)+found(copy(s,l+1,l),h-1);

    found:= sum;

    end;

    begin

    readln(n);

    readln(high,low);

    readln(s);

    if low>n then begin writeln(0); halt; end;

    if high>n then high:=n;

    writeln(found(s,n));

    end.

  • 0
    @ 2009-11-02 15:50:10

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    var max,min,m,n,i,j,x,q,p:longint;

    a:array[1..40000] of char;

    begin

    readln(m,max,min);

    n:=1;

    for i:=1 to m do n:=n*2;

    for i:=1 to n do

    begin

    read(a[i]);

    if min=0 then

    if a[i]='0' then inc(x)

    else inc(q);

    end;

    for j:=1 to max do

    begin

    n:=n div 2;

    for i:=1 to n do

    if (a='0') and (a='0') then a[i]:='0'

    else if (a='1') and (a='1') then a[i]:='1'

    else a[i]:='2';

    if j>=min then for i:=1 to n do

    if a[i]='0' then inc(x)

    else if a[i]='1' then inc(q)

    else inc(p);

    end;

    writeln(p+q*2+x*5);

    end.

    0 0 得0

    1 1 得1

    else得2

    哈哈

    0 1 0 1 0 0 1 1

    \/ \/ \/ \/

    2 2 0 1

    \ / \ /

    2 2

    \ /

    2

    2=普通

    1=奇异

    0=稀有

    5+5*2+4*5=35

  • 0
    @ 2009-11-01 16:14:34

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    秒杀

  • 0
    @ 2009-11-01 08:50:25

    难道我是火星人?没看懂地球文字!

    ............................

    我汗....求求你不要再用这种阴人的题浪费我的时间....

  • 0
    @ 2009-10-30 22:39:15

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:答案正确... 0ms

    ├ 测试数据 08:答案正确... 0ms

    ├ 测试数据 09:答案正确... 0ms

    ├ 测试数据 10:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    var l1,l2,l3:longint;

    i,d,u,leng,n:longint;

    st:ansistring;

    x:int64;

    procedure find(l,r,dep:longint);

    var l1,l2,f,i:longint;

    begin

    if l=r then

    begin

    if (n-dep>=d)and(n-dep=d)and(n-dep

  • 0
    @ 2009-10-29 22:04:47

    超短代码。。。一次AC!

    var s:ansistring;

    n,high,low:longint;

    function work(s:ansistring;h:longint):longint;

    var l,sum:longint;

    begin

    if hhigh then sum:=0 else sum:=1+ord(pos('1',s)=0)*4+ord(pos('0',s)=0);

    l:=length(s) div 2;

    if l>=1 then sum:=sum+work(copy(s,1,l),h-1)+work(copy(s,l+1,l),h-1);

    work:=sum;

    end;

    begin

    readln(n);

    readln(high,low);

    readln(s);

    if low>n then begin writeln(0); exit; end;

    if high>n then high:=n;

    writeln(work(s,n));

    end.

  • 0
    @ 2009-10-24 19:49:20

    Accepted 有效得分:100 有效耗时:0ms

    仅仅是个递归啊。。

    不会栈溢出 也不会超时。。放心去递归吧

  • 0
    @ 2009-10-23 20:05:24

    要先判断范围

    if d>n then begin writeln(0); halt; end;

    if u>n then u:=n;

    只写这两句话就可以过6个点了……

  • 0
    @ 2009-10-23 16:25:59

    强烈鄙视这题

    u,d的范围竟然这么大

    害得我的马甲啊~

  • 0
    @ 2009-10-20 19:07:53

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:运行时错误...|错误号: 200

    ├ 测试数据 04:运行时错误...|错误号: 200

    ├ 测试数据 05:答案正确... 0ms

    ├ 测试数据 06:答案正确... 0ms

    ├ 测试数据 07:运行时错误...|错误号: 200

    ├ 测试数据 08:运行时错误...|错误号: 200

    ├ 测试数据 09:运行时错误...|错误号: 200

    ├ 测试数据 10:运行时错误...|错误号: 200

    var i,j,top,dow,k,l,n,m,tot:longint;

    a:array['0'..'1'] of integer;

    s:ansistring;

    begin

    readln(n);

    readln(top,dow);

    m:=1;

    readln(s);

    for i:=1 to n do

    m:=m*2;

    for i:=dow to top do

    begin

    a['0']:=0;

    a['1']:=0;

    k:=1;

    for j:=1 to i do

    k:=k *2;

    for j:= 0 to ((m div k) -1) do

    begin

    a['0']:=0;

    a['1']:=0;

    for l:= j*k+1 to (j+1)*k do

    inc(a[s[l]]);

    if a['0']=0 then inc(tot,2);

    if a['1']=0 then inc(tot,5);

    if (a['0']0 ) and(a['1']0) then inc(tot);

    end;

    end;

    writeln(tot);

    end.

    大牛帮忙看看为什么?

  • 0
    @ 2009-10-15 19:56:01

    超短代码

    var

    st:ansistring;

    n,u,d:longint;

    function find(st:ansistring;k:longint):longint;

    var

    now:longint;

    begin

    if pos('0',st)=0 then now:=2

    else if pos('1',st)=0 then now:=5

    else now:=1;

    if (ku) then now :=0;

    if length(st)>1 then now:=now+find(copy(st,1,(length(st) div 2)),k-1)+find(copy(st,(length(st) div 2)+1,(length(st) div 2)),k-1);

    exit(now);

    end;

    begin

    readln(n);

    readln(u,d);

    read(st);

    write(find(st,n));

    end.

信息

ID
1501
难度
6
分类
树结构 点击显示
标签
递交数
1684
已通过
456
通过率
27%
被复制
2
上传者