援助方案
坐标和图形数比较小,每处理一个图形暴力枚举可能在图形里的整点然后判断即可。圆用距离公式,矩形。。。,三角形用向量。注意圆可能覆盖到二三四象限。
Code uses math; var f:array[-60..110,-60..110] of boolean; ans:int64; n,i:longint; ch:char; function cross(x1,y1,x2,y2:longint):longint; begin Cross:=x1*y2-x2*y1; end; function ok(a,b,c:longint):boolean; begin ok:=false; if(a>=0)and(b>=0)and(c>=0)then ok:=true; if(a<=0)and(b<=0)and(c<=0)then ok:=true; end; procedure Triangle; var i,j,x1,x2,x3,xa,xb,xc,y1,y2,y3,ya,yb,yc,up,down,left,right:longint; begin readln(x1,y1,x2,y2,x3,y3); xa:=x2-x1;ya:=y2-y1; xb:=x3-x2;yb:=y3-y2; xc:=x1-x3;yc:=y1-y3; up:=max(max(y1,y2),y3); down:=min(min(y1,y2),y3); right:=max(max(x1,x2),x3); left:=min(min(x1,x2),x3); for i:=left to right do for j:=down to up do if(not f[i][j])and (ok(Cross(i-x1,j-y1,xa,ya), Cross(i-x2,j-y2,xb,yb), Cross(i-x3,j-y3,xc,yc)) ) then begin inc(ans); f[i][j]:=true; end; end; procedure circle; var x,y,r,i,j,rr:longint; begin readln(x,y,r);rr:=r*r; for i:=x-r to x+r do for j:=y-r to y+r do if (not f[i][j])and ((i-x)*(i-x)+(j-y)*(j-y)<=rr) then begin inc(ans); f[i][j]:=true; end; end; procedure Square; var x,y,l,i,j:longint; begin readln(x,y,l); for i:=x to x+l do for j:=y to y+l do if not f[i][j] then begin inc(ans); f[i][j]:=true; end; end; BEGIN readln(n); for i:=1 to n do begin read(ch); case ch of 'T':Triangle; 'C':circle; 'S':Square; end; end; writeln(ans); END.
数字游戏
标程是单调队列。我用数组模拟双链表A掉的。实际上我是维护了一个单调不降的线性表。内存泄露神马的不管了。
Code var ch:char; next,pre,num:array[0..5000000] of longint; i,j,h,t,n,len:longint; BEGIN reset(input);rewrite(output); while not eoln do begin read(ch); inc(len); num[len]:=ord(ch)-ord('0'); end; readln(n); if n=len then begin writeln(0);halt;end; for i:=1 to len do begin pre[i]:=i-1; next[i]:=i+1; end; pre[1]:=0;next[len]:=0;h:=1;t:=len; i:=1; while n>0 do begin while(i<>0)and(num[i]<=num[next[i]])do i:=next[i]; if i=0 then i:=t; dec(n);dec(len); next[pre[i]]:=next[i]; pre[next[i]]:=pre[i]; if pre[i]=0 then h:=next[i]; if next[i]=0 then t:=pre[i]; i:=pre[i];if i=0 then i:=h; end; i:=h; while(i<>0)and(num[i]=0)do i:=next[i]; if i=0 then writeln(0) else begin while(i<>0)do begin write(num[i]); i:=next[i]; end; writeln; end; END.
哈密顿路
NPC问题做不来。
总结
610人参赛,298人有分,两个AK的,3个280以上,我150分,69名,如果第二题仔细一点就好了,200分的话是26名。写完程序必须自己造数据。