【省选水题集Day1】一起来AK水题吧! 题解(更新到B)

题目:http://www.cnblogs.com/ljc20020730/p/6937936.html

 水题A:[AHOI2001]质数和分解

安徽省选OI原题!简单Dp。

一看就是完全背包求方案数!

完全背包都会打吧,原来是最优值,现在是累计值。

状态转移方程:f[j]=f[j]+f[j-w[i]],w[i]是待选质数。

理解:一个数要拆成若干素数和,等同于拆成所有该数减去一个素数差的方案数之和(而不是最优方案数)

但这么做需要初始化为0,同时用滚动数组可以减小时间和空间复杂度。

代码如下:(懒得打筛法求素数了)

const maxn=200;
var w,f:array[0..1000000]of longint;
    u:array[1..1000000]of boolean;
    i,j,x,t:longint;
begin
w[1]:=2;
fillchar(u,sizeof(u),true);
inc(t);
 for i:=3 to maxn do begin
  for j:=2 to (i div 2)do
   if i mod j=0 then begin u[i]:=false; break;end;
  if u[i] then begin inc(t); w[t]:=i;end;
 end;
f[0]:=1;
for i:=1 to t do
for j:=w[i] to maxn do
 f[j]:=f[j]+f[j-w[i]];
 while not eof do begin
  readln(x);
  writeln(f[x]);
 end;
end.

2017-6-3 更新

水题B:[JSOI2008]完美的对称

首先要明确一点,对于给出的n组数据不是有序的。

这道题目让我们求出这n个点是否关于某一个点成对称像点。

那么需要贪心求解,具体做法如下。

对n组数据的x坐标y坐标分别为第一第二关键字排序。

首尾元素的x的平均值记为待定中心像点x坐标x

首尾元素的y的平均值记为待定中心像点y坐标y

这样待定中心像点坐标出来了。

接下来判断剩余(n/2-1)组是否关于该中心像点对称,操作如上。

如果判断为true,那么中心像点就是所求的点

否则,人物站在危险的地方,按题目输出。

程序:

type rec=record
x,y:longint;
end;
var a:array[1..100000]of rec;
    x,y:double;
    n,i:longint ;
procedure qsort(l,r:longint);
var t:rec;
    midx,midy,i,j:longint;
begin                      ;
 i:=l;j:=r;
 midx:=a[(l+r)div 2].x;
 midy:=a[(l+r)div 2].y;
 repeat
  while (a[i].x<midx)or((a[i].x=midx)and(a[i].y<midy))do inc(i);
  while (a[j].x>midx)or((a[j].x=midx)and(a[j].y>midy))do dec(j);
  if i<=j then begin
  t:=a[i]; a[i]:=a[j]; a[j]:=t;
  inc(i); dec(j);
  end;
 until i>j;
 if l<j then qsort(l,j);
 if i<r then qsort(i,r);
end;
begin
  readln(n);
  for i:=1 to n do readln(a[i].x,a[i].y);
  qsort(1,n);
  x:=(a[1].x+a[n].x)/2;
  y:=(a[1].y+a[n].y)/2;
  for i:=2 to (n+1) div 2 do begin
    if ((a[i].x+a[n-i+1].x)/2<>x) or((a[i].y+a[n-i+1].y)/2<>y) then begin
     writeln('This is a dangerous situation!');
     halt;
    end;
  end;
   writeln('V.I.P. should stay at (',x:0:1,',',y:0:1,').');
end.

2017-6-10 更新

posted @ 2017-06-03 17:46  ljc20020730  阅读(276)  评论(0编辑  收藏  举报