91 条题解
-
1zhaicong123 LV 8 @ 2010-07-23 21:00:26
狂骂出题人!!!!!!!
题目描述不清
还不如用图来说,!!!!!
1 0 1 0 ————————第0层
\ / \ /
10 10 ————————第1层
\ /
1010 —————第2层 -
12010-07-04 16:39:24@
看似简单的题没想到这么阴人,害我哇了5次!
这个故事告诉我们:
1.注意注释(树是倒着长的,具体看下面的)。
2.d和u可能远远超过树的高度。
3.出题的人太阴了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -
02017-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; }
-
02015-03-29 21:08:23@
第0层是啥,出题人家的树怎么哪边高哪边低都分不清楚.
-
02015-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;
} -
02012-07-21 20:38:40@
原来不只有自己被阴了......
FBI树+判断,小心高度的阴人,不用建树,直接在字符串中搜索‘0’,‘1’字串的位置递归搞定 -
02012-07-12 11:57:56@
根本就是FBI树 变了个形.....高度略坑爹 加个判断 剩下水掉就好了
-
02009-11-05 18:57:34@
这种说的不严谨,,,样例糊弄人的题目,,,,,你要知道,,,,这个树的层可能是上面也可能是下面,,如果你wa了...就把这个树倒过来算第几层吧...上帝保佑你..
-
02009-11-04 19:03:45@
一直忘了把s开成按ansistring -.-
Accepted 有效得分:100 有效耗时:0ms -
02009-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;
beginif 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.
-
02009-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
-
02009-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
秒杀 -
02009-11-01 08:50:25@
难道我是火星人?没看懂地球文字!
............................
我汗....求求你不要再用这种阴人的题浪费我的时间.... -
02009-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 有效耗时:0msvar 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 -
02009-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. -
02009-10-24 19:49:20@
Accepted 有效得分:100 有效耗时:0ms
仅仅是个递归啊。。
不会栈溢出 也不会超时。。放心去递归吧 -
02009-10-23 20:05:24@
要先判断范围
if d>n then begin writeln(0); halt; end;
if u>n then u:=n;
只写这两句话就可以过6个点了…… -
02009-10-23 16:25:59@
强烈鄙视这题
u,d的范围竟然这么大
害得我的马甲啊~ -
02009-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.
大牛帮忙看看为什么? -
02009-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.