38 条题解
-
0cgy4ever LV 10 @ 2008-10-27 18:45:19
写了100+行- -
不过大多都是复制粘贴改几个字 -
02008-10-22 23:22:12@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
谢谢下面大牛提供思想,只要3次旋转即可,分别为:
顺时针旋转 90° (x,y)-->(y,n-x+1)
180° (x,y)-->(n-x+1,n-y+1)
270° (x,y)-->(n-y+1,x)
这样可以简写,不用写那么冗长(50 行左右代码) -
02008-10-20 08:11:54@
事实上是有n^2的算法的..
有8种三角形的形状.统计以每一格为左上右上左下右下和上下左右直角顶点的所有情况
最后扫描累加一遍..
-
02008-10-11 15:25:00@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 275ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:275ms郁闷
数组定到100竟然要错两个点!!!开到101就AC,,,,
我的正确率啊~~~~~~~~~~~~~~~~555 -
02008-10-11 11:17:42@
[red]
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案错误... ├ 标准行输出 1861
├ 错误行输出 B 1
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 212ms
无语……为什么会错,而且错得相当离谱?? -
02008-10-06 21:52:30@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 9ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 56ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 9ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:74ms没有看到有人发算法,那我就写一下吧。
算法三个模块
主算法
--case1
--case2case1是图中第一种情况的三角形计数
形状
++++
+++
++
+
(这里先只考虑左上角是直角的情况)
f(a,b,c)表示直角边长a,左上角第b行第c列是否可能有如图三角形
初始化为f(i,j,k)=false
f(1,1..n,1..n)=true
显然的转移方程f(a,b,c)=f(a-1,b,c+1) and f(a-1,b+1,c) and (pic(b,c)=pic(b,c+1)=pic(b+1,c))
pic代表图中的字母
转移后计数 case1的时间花销为O(n^3)case2就是下面的图
+
+++
+++++
这里状态同上(同样只考虑这一种形状),转移方程
f(a,b,c)=f(a-1,b+1,c-1) and f(a-1,b+1,c) and f(a-1,b+1,c+1) and (pic(b,c)=pic(b+1,c-1)=pic(b+1,c)=pic(b+1,c+1))
同样计算状态后计数
同样时间花销为O(n^3)最后的主算法是枚举四种旋转后调用case1,case2
坐标旋转公式为(x,y)---|>(y,n-x+1),四次调用case1,case2即可最后注意要统计各种字母是否出现,防止陷阱。
总复杂度O(n^3),不是很理想但是足够了。 -
02008-09-26 17:26:32@
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 13ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:13ms
4向搜索,大量复制粘贴 -
02008-09-25 18:52:22@
太简单拉!!!这年头MS枚举很吃香啊!!!不愧是最稳定的算法!!!
-
02008-09-13 12:37:09@
第100题,庆祝提下!
-
02008-10-30 20:36:35@
数组开100的时候:
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案错误... ├ 标准行输出 1861...
├ 错误行输出 B 2...
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案错误... ├ 标准行输出 168
├ 错误行输出 U ...
├ 测试数据 10:答案错误...程序输出比正确答案长数组开110的时候:
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 119ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:119ms天啊……这是为什么?
-
02008-09-08 17:31:32@
动规轻松AC o!
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms -
02008-09-07 11:29:25@
......
-
02008-09-03 19:21:42@
对每个字符进行8个方向的搜索,搜索到1个字符不等于原来的字符马上BREAK,这样所有数据都在0。1S内过(9个0S),注意计算总数的那个开大点,不燃会错(别忘记计算总三角行数,汗~我第一次竟忘记算……)
-
02008-08-26 17:55:16@
一点思路也没有,
那位大牛讲讲? -
02008-08-26 12:11:58@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 259ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:259ms
代码不长呀,40+行
提醒:计算方向的时候用到MOD,最好把方向增量存下来
否则会在常数上TLE -
02008-08-21 10:58:43@
囧!验证码 FFFF
-
02008-08-20 12:24:31@
好长的代码
-
-12009-11-02 10:57:51@
一次A掉.
上下左右每个方向依次搜
O(8*n^2)
---|---|---|---|---|---|---|---|---|---|---|---|---|
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0mstype arra=array[0..101,0..101]of longint;
var
n,all:longint;
map:array[0..101,0..101]of char;
f1,f2,f3:arra;
count:array['A'..'Z']of longint;
app:array['A'..'Z']of boolean;
procedure print(a:arra);
var
i,j:longint;
begin
for i:=1 to n do
begin
for j:=1 to n do write(a,' ');
writeln;
end;
writeln;end;
procedure init;
var
i,j:longint;
beginreadln(n);
fillchar(app,sizeof(app),0);
for i:=1 to n do
begin
for j:=1 to n do
begin
read(map);
app[map]:=true;
end;
readln;
end;
end;
function min(a,b:longint):longint;
begin
if a1 then
count[map]:=count[map]+f1-1;
f2:=min(f2*ord(map=map),f2*ord(map=map))+1;
if f2>1 then
count[map]:=count[map]+f2-1;
f3:=min(f3*ord(map=map),f3*ord(map=map))+1;
if f3>1 then
count[map]:=count[map]+f3-1;
end;
fillchar(f1,sizeof(f1),0);
for i:=n downto 1 do
for j:=1 to n do
begin
f1:=min(f1*ord(map=map),f1*ord(map=map))+1;
if f1>1 then
count[map]:=count[map]+f1-1;
end;fillchar(f1,sizeof(f1),0);
for i:=1 to n do
for j:=1 to n do
begin
f1:=min(min(f1*ord(map=map),f1*ord(map=map)),f1*ord(map=map))+1;
if f1>1 then
count[map]:=count[map]+f1-1;
end;
fillchar(f1,sizeof(f1),0);
for i:=n downto 1 do
for j:=1 to n do
begin
f1:=min(min(f1*ord(map=map),f1)*ord(map=map),f1*ord(map=map))+1;
if f1>1 then
count[map]:=count[map]+f1-1;
end;
fillchar(f1,sizeof(f1),0);
for j:=1 to n do
for i:=1 to n do
begin
f1:=min(min(f1*ord(map=map),f1*ord(map=map)),f1*ord(map=map))+1;
if f1>1 then
count[map]:=count[map]+f1-1;
end;
fillchar(f1,sizeof(f1),0);
for j:=n downto 1 do
for i:=1 to n do
begin
f1:=min(min(f1*ord(map=map),f1*ord(map=map)),f1*ord(map=map))+1;
if f1>1 then
count[map]:=count[map]+f1-1;
end;
all:=0;
for ch:='A' to 'Z' do if app[ch] then all:=all+count[ch];
writeln(all);
for ch:='A' to 'Z' do if app[ch] then
begin
writeln(ch,' ',count[ch]);
end;end;
begin
init;
find;
end.