17.9.2B组总结
特别尴尬。。。所有人都第一,那么努力就没用了。
T1
类似最大生成树的kruskal构造法,用并查集搞一搞就好了(将每一个联通块标记是敌人或不是敌人,连上时判断一下是否可连,如不可就更新答案)。
主代码:
begin
readln(n,k);
for i:=1 to k do
begin
read(x);
bz[x]:=1;
end;
for i:=0 to n-1 do
f[i]:=i;
readln;
for i:=1 to n-1 do
readln(a[i,1],a[i,2],a[i,3]);
kp(1,n-1);
for i:=1 to n-1 do
begin
x:=get(a[i,1]);
y:=get(a[i,2]);
if (bz[x]=1)and(bz[y]=1) then
inc(ans,a[i,3])
else
begin
if bz[x]=1 then
bz[y]:=1;
f[x]:=y;
end;
end;
writeln(ans);
//writeln(chr(26));(完全无卵用,数据坑)
end.
T2
考试想到暴力可以过,正当我得意之时被题目描述结结实实地坑了一把······
首先注意第一行是原文转密文的字母,但输出时却应该是密文转原文,话说数据也太水了吧,这么大的一个错误居然还能拿47.1。
暴力过程:
l:=length(s);
for i:=(l-1) div 2+1 to l-1 do
begin
bz:=1;
for j:=1 to l-i do
begin
if s[j]<>a[s[j+i]] then
begin
bz:=0;
break;
end;
end;
if bz=1 then
begin
for j:=1 to i do
write(s[j]);
for j:=1 to i do
write(b[s[j]]);
writeln;
//writeln(#26);(照例不用管)
halt;
end;
end;
T3
略显尴尬的一题,有各种千奇百怪的“情况说”,不过大致只有这几种:
设f[i,j,1/0]表示已经做了前i行,分为j块田地,当前第i行是否分成了两个区域,然后方程就是:
f[i,j,0]:=(f[i,j,0]+(f[i-1,j-1,0]+f[i-1,j-1,1])*2+f[i-1,j-2,0]+f[i-1,j-2,1]+f[i-1,j,0]) mod mo;
f[i,j,1]:=(f[i,j,1]+f[i-1,j,0]*2+f[i-1,j,1]+f[i-1,j-1,0]+f[i-1,j-1,1]) mod mo;
最后答案就是(f[n,k,0]+f[n,k,1]) mod mo。
注意mo=
108+7
,不是
109+7
。
近期总结
这次开学语数英没考好,这学期要努力了!!!