2016年提高组模拟试题(20161105)高维宇宙
2016-11-05 14:54
274 查看
分析:
一开始把可以组成一组的所有点连起来,然后打一遍匹配即可。
代码:
type node=record x,y,next:longint; end; const maxn=200; maxv=7000; var g:array [1..maxv] of node; ls,link,a:array [1..maxn] of longint; cover:array [1..maxn] of boolean; es:array [1..2001] of boolean; n,e:longint; procedure init; var i,x,y,j,m:longint; begin readln(n); m:=0; for i:=2 to 2001 do begin es[i]:=true; for j:=2 to trunc(sqrt(i)) do if i mod j=0 then begin es[i]:=false; break; end; end; for i:=1 to n do begin read(a[i]); for j:=1 to i-1 do begin if es[a[i]+a[j]] then begin inc(m); g[m].x:=i; g[m].y:=j; g[m].next:=ls[i]; ls[i]:=m; inc(m); g[m].x:=j; g[m].y:=i; g[m].next:=ls[j]; ls[j]:=m; end; end; end; end; function find(p:longint):boolean; var t,q:longint; begin find:=true; t:=ls[p]; while t>0 do with g[t] do begin if cover[y]=false then begin cover[y]:=true; q:=link[y]; link[y]:=p; if (q=0) or find(q) then exit; link[y]:=q; end; t:=next; end; find:=false; end; procedure main; var i:longint; begin for i:=1 to n do begin fillchar(cover,sizeof(cover),0); find(i); end; end; procedure print; var i,s:longint; begin s:=0; for i:=1 to n do if link[i]<>0 then s:=s+1; writeln(s div 2); end; begin init; main; print; end.
相关文章推荐
- 2016年提高组模拟试题(20161105) 方程式
- 2016年提高组模拟试题(20161105) 方程式
- 2016年提高组模拟试题(20161105)Mahjong
- SSL2560 2016年提高组模拟试题 连锁店(贪心)
- SSL2562 2016年提高组模拟试题 禅与园林艺术
- SSL2556 2016年提高组模拟试题(20161107)舞会配对(贪心)
- 2016年提高组模拟试题(20161116) 《逍遥游》ssl 2581 奇葩
- CCF-NOIP-2018 提高组(复赛) 模拟试题(三)
- 2016年普级组模拟试题(10月20日) 小游戏game
- CCF-NOIP-2018 提高组(复赛) 模拟试题(四)
- 2011分区联赛模拟试题 积木分发(jzoj提高C组)
- 高维宇宙 【NOIP2016提高A组集训第3场10.31】
- 【NOIP2016提高A组集训第3场10.31】高维宇宙
- 2011分区联赛模拟试题 积木分发(jzoj提高C组)
- SSL2542 2016提高组模拟试题 皮皮(并查集)
- 2016.08.17【初中部 NOIP提高组 】模拟赛C(图论专项模拟试题)
- CCF-NOIP-2018 提高组(复赛) 模拟试题(五)
- SSL2541 2016提高组模拟试题 敌敌(树形dp)
- CCF-NOIP-2018 提高组(复赛) 模拟试题(一)
- CCF-NOIP-2018 提高组(复赛) 模拟试题(七)