http://blog.sina.com.cn/wysoviet[订阅][手机订阅]
个人资料
评论
读取中...
访客
读取中...
分类
    内容读取中…
好友
读取中...
音乐播放器
博文

题意:

N个不同的颜色的不透明的长方形(1 <= N <= 1000)被放置在一张宽为A长为B的白纸上。这些长方形被放置时,保证了它们的边与白纸的边缘平行。所有的长方形都放置在白纸内,所以我们会看到不同形状的各种颜色。坐标系统的原点(0,0)设在这张白纸的左下角,而坐标轴则平行于边缘。

 

分析:

 这题卡了很长时间,因为只想到最直接的办法,用boolean数组记录,从后往前覆盖,最后扫描一遍

 但长方形的长宽很大(<=10,000),很容易超时

 然后同学告诉我用矩形分割来做

 +--------+      +-+--+--+
            | |2 |  |
            + +--+  |
  +-+   --> | |  |
  +-+       |1|  |3 |
        

题意:给n个数从中选出一组数使其和为这N个数之和减去给定的TotalW

     1)没有方案输出0

     2)有多种方案输出-1

     3)只有一种方案,按升序输出这组数的编号

分析:拿到题很快就想到类似于DP的算法求出最后的方案数

      f[j]:=f[j]+f[j-a[i]]

      {f[j]--总和为j的方案数,a[i]--编号为i的数的大小

      对于每个大于等于a[i]的总和情况,考虑最后一个数是a[i]的情况}

 

      算的时候遇到问题

       for i:=a[i] to max do

        if f[j-a[i]]<>0 then inc(f[j],f[j-a[i]]);

     这样的话可能a[i]<j-a[i],f[j-a[i]]可能已经是最后由a[i]结尾的情况

     f[j]不能由f[j-a[j]]的最后加上a[i]得到

     所以考虑从

利用积性函数的优化.

这个文章主要介绍了3算法

1线性时间筛素数

2线性时间求前n个数的欧拉函数值

3线性时间求前n个数的约数个数

 

一、   首先介绍下积性函数。

 

下面是wiki的条目:

 

在非数论的领域,积性函数指有对于任何a,b都有性质f(ab)=f(a)f(b)的函数。

 

在数论中的积性函数。对于正整数n的一个算术函数f(n),当中f(1)=1且当a,b互质,f(ab)=f(a)f(b),在数论上就称它为积性函数。

若某算术函数f(n)符合f(1)=1,且就算a,b不互质,f(ab)=f(a)f(b),称它为完全积性的。

 

例子

φ(n) -欧拉φ函数,计算与n互质的正整数之数目

μ(n) -默比乌斯函数,关于非平方数的质因子数目

usaco 3.1.2 inflate(2008-08-02 20:16)

【大意】有几种题目,每一种有无限道,给出做各种题的时间和得分,求在给定的时间内可以得到的分数最大值

【算法】无限背包,但朴素的无限背包超时 ,需要优化一下,再读入的过程中就进行DP

【程序清单】

 {ID:wangyang91
 PROG:inflate
 LANG:PASCAL
}var f:array[0..10000]of longint;
    n,i,j,k,t,m:longint;

begin
 assign(input,'inflate.in');reset(input);
 assign(output,'inflate.out');rewrite(output);

 readln(m,n);
 for i:=1 to n do
  begin
   readln(k,t);
   for j:=0 to m-t do
    if f[j+t]<f[j]+k then
     f[j+t]:=f[j]+k;
  end;
 writeln(f[m]);

 close(input);
 close(output);
end.

usaco 3.1.1 agrinet(2008-08-02 17:08)
 题意:求能连接所有农场的方案的最短长度
 算法:prim最小生成树
 程序清单:
 

{ID:wangyang91
 PROG:agrinet
 LANG:PASCAL
}
var a:array[1..100,1..100]of longint;
    sum:int64;
    i,j,k,t,n,min:longint;

begin
  assign(input,'agrinet.in');reset(input);
  assign(output,'agrinet.out');rewrite(output);

  readln(n);
  for i:=1 to n do
   for j:=1 to n do
    read(a[i,j]);
  sum:=0;
  a[1,1]:=-1;
  for k:=1 to n-1 do
   begin
    min:=maxlongint;
    t:=0;
    for i:=1 to n do
     if a[i,i]=-1 then
      for j:=1 to n do
  

usaco 2.4.4 comehome(2008-08-02 16:02)
 题意:有'a'..'z'个牧场,牧场内可能有牛,‘A’..'Y'代表有牛,‘Z’带表谷仓,牧场之间(包括自己与自己),牧场与谷仓之间有路径,牛的速度一样,求最早到达谷仓的牛及路径长度。
 分析:Dijkstra单源最短路径,但自己第一次写的时候犯了个错,即把‘A’与‘a’当作是一样的,它们之间的路径没有算在内,但实际上它们之间的路径是一定要走的。所以把‘A’与‘a’分开一共52个点进行Dijkstra。
 反思:在做'car的旅游路线'时就犯了类似错误,Dijkstra单源最短路径的理解还不够深刻,一定要是各个点之间的。
 程序清单:
{ID:wangyang91
 PROG:comehome
 LANG:PASCAL
}
var a:array[1..52,1..52]of longint;
    vis:array[1..52]of boolean;
    ch1,ch2:char;
    i,j,k,t,n,min:longint;

begin
 assign(input,'comehome.in');reset(input);
 assign(output,'comehome.out');rewrite(output);

 

usaco 2.4.3 cowtour(2008-08-02 15:45)
 题意:牧场里有很多牧区,连通的牧区组成一个牧场,牧场里的最大路径长度为牧场的直径。现有两个牧场,连接一条路径后使两牧场连通,求连接后新牧场的最短直径。
 算法:用floyd求出各牧区之间的最短距离,然后扫描一遍求出,每个牧区在其所在牧场能到达的最大路径长度max[i],枚举两不连通的牧区(i,j),求出min{max[i]+max[j]+sqrt(sqr(a[i]-a[j])+sqr(b[i]-b[j]))}
 注意:结果不一定是所求出的min,因为min不一定是新牧场的直径,所以应还求出m=max{max[i]};ans=max{min,m};
 程序清单:

{ID:wangyang91
 PROG:cowtour
 LANG:PASCAL
}
const most=1e20;

var f:array[1..150,1..150]of real;
    a:array[1..150,1..2]of longint;
    n,i,j,k,t:longint;
    str:string;
    min,m:real;
    max:array[1..150]of real;

begin
 assign(input,'

破解还原卡(2008-01-11 19:40)
上竞赛课,老师又不管我们。
 
我在网上搜关于还原卡破解的内容。有很多,看了半天发现最后一句话是“该方法适用于W2K以下,W2K以上的直接用‘还原卡克星’”。真是有毛病,这句话应放在最前面。

接着,就下了还原卡克星,在旁边的一台机子上试了一下,果然不还原了。
但新的问题出现了,就是我也控制不了还原卡了。那台机子每次开机都提示是否安装还原卡,还要求软盘驱动,真是讨厌。
 
不过,反正是学校的机子,坏了算了,每次开机都直接有QQ的感觉真爽!