“用户:Shmetrofans”的版本间差异

来自中国分布式计算总站
跳转到导航 跳转到搜索
第1行: 第1行:
 
== shmetrofans ==
 
== shmetrofans ==
{{Notice|2013年即将举行NOI2013。|#99CCCC|#CCFFFF|OIer提醒您}}
+
{{Notice|2013年即将举行NOI 2013,期待您的关注!|#99CCCC|#CCFFFF|OIer——Shmetrofans提醒您}}
 
{{WikiRelated||zh|User:ThomasElements}}
 
{{WikiRelated||zh|User:ThomasElements}}
 +
== NOIP 2012 解题报告==
 +
=== 质因数分解 ===
 +
<source lang="text">
 +
program prime;
 +
var
 +
i,n,k,ans:longint;
 +
begin
 +
assign(input,'prime.in');
 +
reset(input);
 +
assign(output,'prime.out');
 +
rewrite(output);
 +
read(input,n);
 +
i:=3;
 +
if n mod 2=0 then i:=2
 +
else while n mod i<>0 do i:=i+2;
 +
write(output,n div i);
 +
close(input);
 +
close(output);
 +
end.
 +
</source>
 +
 +
=== 寻宝 ===
 +
<source lang="text">
 +
program treasure;
 +
var
 +
f,p:array [1..10005,0..105] of longint;
 +
n,m,i,j,k,start,ans:longint;
 +
function getpos(c,x,k:longint):longint;
 +
var
 +
i,j,all:longint;
 +
begin
 +
all:=0;
 +
for i:= 0 to m-1 do
 +
  if f[c,i]=1 then inc(all);
 +
k:= k mod all;
 +
if k=0 then k:=all;
 +
j:=0;
 +
i:=x;
 +
while true do
 +
  begin
 +
  if f[c,i]=1 then inc(j);
 +
  if j=k then exit(i);
 +
  i:= (i+1) mod m;
 +
  end;
 +
end;
 +
begin
 +
assign(input,'treasure.in');
 +
reset(input);
 +
assign(output,'treasure.out');
 +
rewrite(output);
 +
readln(input,n,m);
 +
for i:= 1 to n do
 +
  for j:= 0 to m-1 do
 +
  readln(f[i,j],p[i,j]);
 +
read(input,start);
 +
ans:=0;
 +
for i:=1 to n do
 +
  begin
 +
  ans:=(ans+p[i,start]) mod 20123;
 +
  start:=getpos(i,start,p[i,start]);
 +
  end;
 +
write(output,ans);
 +
close(input);
 +
close(output);
 +
end.
 +
</source>
 +
 +
=== 摆花 ===
 +
<source lang="text">
 +
program flower;
 +
var
 +
f:array[0..105,0..105] of longint;
 +
n,m,k,c,i,j:longint;
 +
begin
 +
assign(input,'flower.in');
 +
reset(input);
 +
assign(output,'flower.out');
 +
rewrite(output);
 +
readln(input,n,m);
 +
fillchar(f,sizeof(f),0);
 +
f[0,0]:=1;
 +
for i:= 1 to n do
 +
  begin
 +
  read(k);
 +
  for j:= 0 to k do
 +
    for c:= 0 to m do
 +
    begin
 +
      if c<j then continue;
 +
      f[i,c]:=(f[i,c]+f[i-1,c-j]) mod 1000007;
 +
    end;
 +
  end;
 +
write(output,f[n,m]);
 +
close(input);
 +
close(output);
 +
end.
 +
</source>
 +
 +
=== 文化之旅 ===
 +
<source lang="text">
 +
program culture;
 +
type
 +
edge= record
 +
p,cost,next:longint;
 +
end;
 +
var
 +
e:array[1..20005] of edge;
 +
n,k,m,s,t:longint;
 +
dist,wh,map:array[1..105] of longint;
 +
f:array[1..100,1..100]  of longint;
 +
vist:array[1..100] of boolean;
 +
eq:array[1..100] of longint;
 +
h,r,count,now,next,p:longint;
 +
i,j,all,x,y,z:longint;
 +
atk:array[1..100,1..100] of longint;
 +
flag:boolean;
 +
procedure insert(x,y,c:longint);
 +
begin
 +
all:=all+1;
 +
e[all].p:=y;
 +
e[all].next:=map[x];
 +
e[all].cost:=c;
 +
map[x]:=all;
 +
end;
 +
function find(k,x:longint):longint;
 +
begin
 +
if f[k,x]=x then exit(x);
 +
exit(find(k,f[k,x]));
 +
end;
 +
procedure union(k,x,y:longint);
 +
var
 +
a,b:longint;
 +
begin
 +
a:=find(k,x);
 +
b:=find(k,y);
 +
if a<>b then f[a]:=f[b];
 +
end;
 +
begin
 +
assign(input,'culture.in');
 +
reset(input);
 +
assign(output,'culture.out');
 +
rewrite(output);
 +
readln(input,n,k,m,s,t);
 +
for i:= 1 to n do read(input,wh[i]);
 +
readln(input);
 +
for i:= 1 to k do
 +
  begin
 +
  for j:= 1 to k do read(input,atk[i,j]);
 +
  readln(input);
 +
  end;
 +
all:=0;
 +
fillchar(map,sizeof(map),0);
 +
for i:= 1 to m do
 +
  begin
 +
  readln(x,y,z);
 +
  insert(x,y,z);
 +
  insert(y,x,z);
 +
  end;
 +
for i:= 1 to k do f[s,i]:=i;
 +
fillchar(dist,sizeof(dist),$1f);
 +
dist[s]:=0;
 +
fillchar(vist,sizeof(vist),false);
 +
h:=1;
 +
r:=1;
 +
count:=1;
 +
eq[1]:=s;
 +
vist[s]:=true;
 +
while count<>0 do
 +
  begin
 +
  now:=eq[h];
 +
  h:=h+1;
 +
  if h>n then h:=1;
 +
  count:=count-1;
 +
  vist[now]:=false;
 +
  next:=map[now];
 +
  while next<>0 do
 +
    begin
 +
    p:=e[next].p;
 +
    flag:=true;
 +
    for i:= 1 to k do
 +
      if atk[wh[p],i]=1 then
 +
      if find(now,wh[i]) = find(now,wh[s]) then
 +
        begin
 +
        flag:=false;
 +
        break;
 +
        end;
 +
    if flag then
 +
      begin
 +
      if dist[p]>dist[now]+e[next].cost then
 +
        begin
 +
        dist[p]:=dist[now]+e[next].cost;
 +
        f[p]:=f[now];
 +
        union(p,wh[s],wh[p]);
 +
        if not vist[p] then
 +
          begin
 +
          inc(r);
 +
          if r>n then r:=1;
 +
          count:=count+1;
 +
          eq[r]:=p;
 +
          vist[p]:=true;
 +
          end;
 +
        end;
 +
      end;
 +
    next:=e[next].next;
 +
    end;
 +
  end;
 +
if dist[t]=522133279 then write(-1)
 +
else write(output,dist[t]);
 +
close(input);
 +
close(output);
 +
end.
 +
</source>

2013年6月2日 (日) 14:40的版本

shmetrofans

OIer——Shmetrofans提醒您
2013年即将举行NOI 2013,期待您的关注!
如果你希望有更深入的了解,维基百科有一个主题关于:User:ThomasElements

NOIP 2012 解题报告

质因数分解

<source lang="text"> program prime; var

i,n,k,ans:longint;

begin

assign(input,'prime.in');
reset(input);
assign(output,'prime.out');
rewrite(output);
read(input,n);
i:=3;
if n mod 2=0 then i:=2
else while n mod i<>0 do i:=i+2;
write(output,n div i);
close(input);
close(output);

end. </source>

寻宝

<source lang="text"> program treasure; var

f,p:array [1..10005,0..105] of longint;
n,m,i,j,k,start,ans:longint;

function getpos(c,x,k:longint):longint; var

i,j,all:longint;

begin

all:=0;
for i:= 0 to m-1 do
 if f[c,i]=1 then inc(all);
k:= k mod all;
if k=0 then k:=all;
j:=0;
i:=x;
while true do
 begin
  if f[c,i]=1 then inc(j);
  if j=k then exit(i);
  i:= (i+1) mod m;
 end;

end; begin

assign(input,'treasure.in');
reset(input);
assign(output,'treasure.out');
rewrite(output);
readln(input,n,m);
for i:= 1 to n do
 for j:= 0 to m-1 do
  readln(f[i,j],p[i,j]);
read(input,start);
ans:=0;
for i:=1 to n do
 begin
  ans:=(ans+p[i,start]) mod 20123;
  start:=getpos(i,start,p[i,start]);
 end;
write(output,ans);
close(input);
close(output);

end. </source>

摆花

<source lang="text"> program flower; var

f:array[0..105,0..105] of longint;
n,m,k,c,i,j:longint;

begin

assign(input,'flower.in');
reset(input);
assign(output,'flower.out');
rewrite(output);
readln(input,n,m);
fillchar(f,sizeof(f),0);
f[0,0]:=1;
for i:= 1 to n do
 begin
  read(k);
  for j:= 0 to k do
   for c:= 0 to m do
    begin
     if c<j then continue;
     f[i,c]:=(f[i,c]+f[i-1,c-j]) mod 1000007;
    end;
 end;
write(output,f[n,m]);
close(input);
close(output);

end. </source>

文化之旅

<source lang="text"> program culture; type

edge= record
p,cost,next:longint;
end;

var

e:array[1..20005] of edge;
n,k,m,s,t:longint;
dist,wh,map:array[1..105] of longint;
f:array[1..100,1..100]  of longint;
vist:array[1..100] of boolean;
eq:array[1..100] of longint;
h,r,count,now,next,p:longint;
i,j,all,x,y,z:longint;
atk:array[1..100,1..100] of longint;
flag:boolean;

procedure insert(x,y,c:longint); begin

all:=all+1;
e[all].p:=y;
e[all].next:=map[x];
e[all].cost:=c;
map[x]:=all;

end; function find(k,x:longint):longint; begin

if f[k,x]=x then exit(x);
exit(find(k,f[k,x]));

end; procedure union(k,x,y:longint); var

a,b:longint;

begin

a:=find(k,x);
b:=find(k,y);
if a<>b then f[a]:=f[b];

end; begin

assign(input,'culture.in');
reset(input);
assign(output,'culture.out');
rewrite(output);
readln(input,n,k,m,s,t);
for i:= 1 to n do read(input,wh[i]);
readln(input);
for i:= 1 to k do
 begin
  for j:= 1 to k do read(input,atk[i,j]);
  readln(input);
 end;
all:=0;
fillchar(map,sizeof(map),0);
for i:= 1 to m do
 begin
  readln(x,y,z);
  insert(x,y,z);
  insert(y,x,z);
 end;
for i:= 1 to k do f[s,i]:=i;
fillchar(dist,sizeof(dist),$1f);
dist[s]:=0;
fillchar(vist,sizeof(vist),false);
h:=1;
r:=1;
count:=1;
eq[1]:=s;
vist[s]:=true;
while count<>0 do
 begin
  now:=eq[h];
  h:=h+1;
  if h>n then h:=1;
  count:=count-1;
  vist[now]:=false;
  next:=map[now];
  while next<>0 do
   begin
    p:=e[next].p;
    flag:=true;
    for i:= 1 to k do
     if atk[wh[p],i]=1 then
      if find(now,wh[i]) = find(now,wh[s]) then
       begin
        flag:=false;
        break;
       end;
    if flag then
     begin
      if dist[p]>dist[now]+e[next].cost then
       begin
        dist[p]:=dist[now]+e[next].cost;
        f[p]:=f[now];
        union(p,wh[s],wh[p]);
        if not vist[p] then
         begin
          inc(r);
          if r>n then r:=1;
          count:=count+1;
          eq[r]:=p;
          vist[p]:=true;
         end;
       end;
     end;
    next:=e[next].next;
   end;
 end;
if dist[t]=522133279 then write(-1)
else write(output,dist[t]);
close(input);
close(output);

end. </source>