posts - 100,  comments - 15,  trackbacks - 0
 

//和2318差不多,只是输入的board是无序的,输出是玩具数为t(>0)的箱子数(>0)

#include<iostream>
#include
<stdlib.h>
using namespace std;
#define MAXN 5000+1
#define eps 1e-8
#define _sign(x) ((x)>eps?1:((x)<-eps?2:0))

struct point{int x,y;};
struct line{point a,b;};

int ans[MAXN];
line board[MAXN];

double xmult(point p0,point p1,point p2){//叉积,囧
    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}

int cmp(const void *a,const void *b)
{
    line 
*aa=(line*)a,*bb=(line*)b;
    
if(aa->a.x == bb->a.x) 
        
return aa->b.x - bb->b.y;
    
else return aa->a.x - bb->a.x;
}

int main()
{
    
int n,m,x1,y1,x2,y2,u1,u2,i;
    point toys;
    
while(scanf("%d",&n)!=EOF && n )
    
{
        memset(ans,
0,sizeof(ans));
        scanf(
"%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
        
for(i=0;i<n;i++)
        
{
            scanf(
"%d%d",&u1,&u2);
            board[i].a.x
=u1;
            board[i].a.y
=y1;
            board[i].b.x
=u2;
            board[i].b.y
=y2;
        }

        qsort(board,n,
sizeof(board[0]),cmp);
        board[n].a.x
=x2;
        board[n].a.y
=y1;
        board[n].b.x
=x2;
        board[n].b.y
=y2;
        
for(i=0;i<m;i++)
        
{
            scanf(
"%d%d",&(toys.x),&(toys.y));
            
int low=0,hig=n,mid;
            
while(low+1<hig)
            
{
                mid
=(low+hig)>>1;
                
double res=xmult(board[mid].a,board[mid].b,toys);
                
if(res>0) low=mid;
                
else hig=mid;
            }

            
if(xmult(board[low].a,board[low].b,toys)<0) ans[low]++;
            
else  ans[low+1]++;
        }

        printf(
"Box\n");
        
int t=1,c;
        
for(t=1;t<=m;t++)
        
{
            
for(i=0,c=0;i<=n;i++)
            
{
                
if(ans[i]==t) 
                
{
                    c
++;
                    ans[i]
=0;
                }

            }

            
if(c>0)
                printf(
"%d: %d\n",t,c);
            m
=m-c*t;
        }

        
    }

    
return 0;
}
posted @ 2009-10-04 13:12 wyiu 阅读(198) | 评论 (0)编辑 收藏

//今天开始按着这个来做题训练计算几何了

计算几何题的特点与做题要领:
1.大部分不会很难,少部分题目思路很巧妙
2.做计算几何题目,模板很重要,模板必须高度可靠。
3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面大部分是模板。如果代码一片混乱,那么会严重影响做题正确率。
4.注意精度控制。
5.能用整数的地方尽量用整数,要想到扩大数据的方法(扩大一倍,或扩大sqrt2)。因为整数不用考虑浮点误差,而且运算比浮点快。

一。点,线,面,形基本关系,点积叉积的理解

POJ 2318 TOYS(推荐)
http://acm.pku.edu.cn/JudgeOnline/problem?id=2318
POJ 2398 Toy Storage(推荐)
http://acm.pku.edu.cn/JudgeOnline/problem?id=2398
一个矩形,有被若干直线分成N个格子,给出一个点的坐标,问你该点位于哪个点中。
知识点:其实就是点在凸四边形内的判断,若利用叉积的性质,可以二分求解。

POJ 3304 Segments
http://acm.pku.edu.cn/JudgeOnline/problem?id=3304
知识点:线段与直线相交,注意枚举时重合点的处理

POJ 1269 Intersecting Lines
http://acm.pku.edu.cn/JudgeOnline/problem?id=1269
知识点:直线相交判断,求相交交点

POJ 1556 The Doors (推荐)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1556
知识点:简单图论+简单计算几何,先求线段相交,然后再用Dij求最短路。

POJ 2653 Pick-up sticks
http://acm.pku.edu.cn/JudgeOnline/problem?id=2653
知识点:还是线段相交判断

POJ 1066 Treasure Hunt
http://acm.pku.edu.cn/JudgeOnline/problem?id=1066
知识点:线段相交判断,不过必须先理解“走最少的门”是怎么一回事。

POJ 1410 Intersection
http://acm.pku.edu.cn/JudgeOnline/problem?id=1410
知识点:线段与矩形相交。正确理解题意中相交的定义。
详见:http://hi.baidu.com/novosbirsk/blog/item/68c682c67e8d1f1d9d163df0.html

POJ 1696 Space Ant (推荐)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1696
德黑兰赛区的好题目。需要理解点积叉积的性质

POJ 3347 Kadj Squares
http://acm.pku.edu.cn/JudgeOnline/problem?id=3347
本人的方法极度猥琐。复杂的线段相交问题。这个题目是计算几何的扩大数据运算的典型应用,扩大根号2倍之后就避免了小数。

POJ 2826 An Easy Problem?! (推荐)
http://acm.pku.edu.cn/JudgeOnline/problem?id=2826
问:两条直线组成一个图形,能容纳多少雨水。很不简单的Easy Problem,要考虑所有情况。你不看discuss看看能否AC。(本人基本不能)提示一下,水是从天空垂直落下的。

POJ 1039 Pipe
http://acm.pku.edu.cn/JudgeOnline/problem?id=1039
又是线段与直线相交的判断,再加上枚举的思想即可。

POJ 3449 Geometric Shapes
http://acm.pku.edu.cn/JudgeOnline/problem?id=3449
判断几何体是否相交,不过输入输出很恶心。
此外,还有一个知识点,就是给出一个正方形(边不与轴平行)的两个对角线上的顶点,需要你求出另外两个点。必须掌握其方法。

POJ 1584 A Round Peg in a Ground Hole
http://acm.pku.edu.cn/JudgeOnline/problem?id=1584
知识点:点到直线距离,圆与多边形相交,多边形是否为凸

POJ 2074 Line of Sight (推荐)
http://acm.pku.edu.cn/JudgeOnline/problem?id=2074
与视线问题的解法,关键是求过两点的直线方程,以及直线与线段的交点。数据有一个trick,要小心。

二。凸包问题

POJ 1113 Wall
http://acm.pku.edu.cn/JudgeOnline/problem?id=1113
知识点:赤裸裸的凸包问题,凸包周长加上圆周。

POJ 2007 Scrambled Polygon
http://acm.pku.edu.cn/JudgeOnline/problem?id=2007
知识点:凸包,按极角序输出方案

POJ 1873 The Fortified Forest (推荐)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1873
World Final的水题,先求凸包,然后再搜索。由于规模不大,可以使用位运算枚举。
详见:http://hi.baidu.com/novosbirsk/blog/item/333abd54c7f22c52574e0067.html

POJ 1228 Grandpa's Estate (推荐)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1228
求凸包顶点数目,很多人求凸包的模板是会多出点的,虽然求面积时能得到正确答案,但是在这个题目就会出问题。此外,还要正确理解凸包的性质。

POJ 3348 Cows
http://acm.pku.edu.cn/JudgeOnline/problem?id=3348
凸包面积计算

三。面积问题,公式问题

POJ 1654 Area
http://acm.pku.edu.cn/JudgeOnline/problem?id=1654
知识点:利用有向面积(叉积)计算多边形面积

POJ 1265 Area
http://acm.pku.edu.cn/JudgeOnline/problem?id=1265
POJ 2954 Triangle
http://acm.pku.edu.cn/JudgeOnline/problem?id=2954
Pick公式的应用,多边形与整点的关系。(存在一个GCD的关系)

四。半平面交

半平面交的主要应用是判断多边形是否存在核,还可以解决一些与线性方程组可行区域相关的问题(就是高中时的那些)。

POJ 3335 Rotating Scoreboard
http://acm.pku.edu.cn/JudgeOnline/problem?id=3335
POJ 3130 How I Mathematician Wonder What You Are!
http://acm.pku.edu.cn/JudgeOnline/problem?id=3130
POJ 1474 Video Surveillance
http://acm.pku.edu.cn/JudgeOnline/problem?id=1474
知识点:半平面交求多边形的核,存在性判断

POJ 1279 Art Gallery
http://acm.pku.edu.cn/JudgeOnline/problem?id=1279
半平面交求多边形的核,求核的面积

POJ 3525 Most Distant Point from the Sea (推荐)
http://acm.pku.edu.cn/JudgeOnline/problem?id=3525
给出一个多边形,求里面的一个点,其距离离多边形的边界最远,也就是多边形中最大半径圆。
可以使用半平面交+二分法解。二分这个距离,边向内逼近,直到达到精度。

POJ 3384 Feng Shui (推荐)
http://acm.pku.edu.cn/JudgeOnline/problem?id=3384
半平面交实际应用,用两个圆覆盖一个多边形,问最多能覆盖多边形的面积。
解法:用半平面交将多边形的每条边一起向“内”推进R,得到新的多边形,然后求多边形的最远两点。

POJ 1755 Triathlon (推荐)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1755
半平面交判断不等式是否有解。注意不等式在转化时正负号的选择,这直接影响到半平面交的方向。

POJ 2540 Hotter Colder
http://acm.pku.edu.cn/JudgeOnline/problem?id=2540
半平面交求线性规划可行区域的面积。

POJ 2451 Uyuw's Concert
http://acm.pku.edu.cn/JudgeOnline/problem?id=2451
Zzy专为他那篇nlogn算法解决半平面交问题的论文而出的题目。

五。计算几何背景,实际上解题的关键是其他问题(数据结构、组合数学,或者是枚举思想)
若干道经典的离散化+扫描线的题目,ACM选手必做题目

POJ 1151 Atlantis (推荐)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1151
POJ 1389 Area of Simple Polygons
http://acm.pku.edu.cn/JudgeOnline/problem?id=1389
矩形离散化,线段树处理,矩形面积求交

POJ 1177 Picture (推荐)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1177
矩形离散化,线段树处理,矩形交的周长,这个题目的数据比较强。线段树必须高效。

POJ 3565 Ants (推荐)
http://acm.pku.edu.cn/JudgeOnline/problem?id=3565
计算几何中的调整思想,有点像排序。要用到线段相交的判断。
详见:http://hi.baidu.com/novosbirsk/blog/item/fb668cf0f362bec47931aae2.html

POJ 3695 Rectangles   
http://acm.pku.edu.cn/JudgeOnline/problem?id=3695
又是矩形交的面积,但是由于是多次查询,而且矩形不多,使用组合数学中的容斥原理解决之最适合。线段树是通法,但是除了线段树,还有其他可行的方法。

POJ 2002 Squares   
http://acm.pku.edu.cn/JudgeOnline/problem?id=2002
枚举思想,求平面上若干个点最多能组成多少个正方形,点的Hash

POJ 1434 Fill the Cisterns!(推荐)
http://acm.pku.edu.cn/JudgeOnline/problem?id=1434
一开始发昏了,准备弄个线段树。其实只是个简单的二分。

六。随机算法
POJ 2420 A Star not a Tree?
http://acm.pku.edu.cn/JudgeOnline/problem?id=2420
多边形的费马点。所谓费马点,就是多边形中一个点P,该点到其他点的距离之和最短。四边形以上的多边形没有公式求费马点,因此可以使用随机化变步长贪心法。
详见:http://hi.baidu.com/novosbirsk/blog/item/75983f138499f825dd54019b.html

七。解析几何
这种题目本人不擅长,所以做得不多,模板很重要。当然,熟练运用叉积、点积的性质还是很有用的。
POJ 1375 Intervals
http://acm.pku.edu.cn/JudgeOnline/problem?id=1375
知识点:过圆外一点求与圆的切线

POJ 1329 Circle Through Three Points   
http://acm.pku.edu.cn/JudgeOnline/problem?id=1329
求三角形外接圆

POJ 2354 Titanic
http://acm.pku.edu.cn/JudgeOnline/problem?id=2354
求球面上两个点的距离,而且给的是地理经纬坐标。

POJ 1106 Transmitters
http://acm.pku.edu.cn/JudgeOnline/problem?id=1106
角度排序,知道斜率求角度,使用atan函数。

POJ 1673 EXOCENTER OF A TRIANGLE
http://acm.pku.edu.cn/JudgeOnline/problem?id=1673
可以转化为三角形的垂心问题。

八。旋转卡壳

POJ 2187 Beauty Contest
http://acm.pku.edu.cn/JudgeOnline/problem?id=2187
凸包求最远点对。可以暴力枚举,也可以使用旋转卡壳。

POJ 3608 Bridge Across Islands(难)
http://acm.pku.edu.cn/JudgeOnline/problem?id=3608
两个凸包的最近距离。本人的卡壳始终WA。郁闷。

九。其他问题
POJ 1981 Circle and Points
http://acm.pku.edu.cn/JudgeOnline/problem?id=1981
求单位圆最多能覆盖平面上多少个点

posted @ 2009-10-04 12:18 wyiu 阅读(124) | 评论 (0)编辑 收藏
//计算几何第一题
//学习了叉积和利用叉积判断左右位置关系
//叉积+二分
//延续了这两天比赛的PE黑手
#include<iostream>
using namespace std;
#define MAXN 5000+1
#define eps 1e-8
#define _sign(x) ((x)>eps?1:((x)<-eps?2:0))

struct point{int x,y;};
struct line{point a,b;};

int ans[MAXN];
point toys[MAXN];
line board[MAXN];

double xmult(point p0,point p1,point p2){//叉积,囧
    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}

int main()
{
    
int n,m,x1,y1,x2,y2,u1,u2,i;
    
bool flag=false;
    
while(scanf("%d",&n)!=EOF && n )
    
{
        
if(flag) printf("\n");
        memset(ans,
0,sizeof(ans));
        scanf(
"%d%d%d%d%d",&m,&x1,&y1,&x2,&y2);
        
for(i=0;i<n;i++)
        
{
            scanf(
"%d%d",&u1,&u2);
            board[i].a.x
=u1;
            board[i].a.y
=y1;
            board[i].b.x
=u2;
            board[i].b.y
=y2;
        }

        board[n].a.x
=x2;
        board[n].a.y
=y1;
        board[n].b.x
=x2;
        board[n].b.y
=y2;
        
for(i=0;i<m;i++)
        
{
            scanf(
"%d%d",&(toys[i].x),&(toys[i].y));
            
int low=0,hig=n,mid;
            
while(low+1<hig)
            
{
                mid
=(low+hig)>>1;
                
double res=xmult(board[mid].a,board[mid].b,toys[i]);
                
//if(res>0)
                if(res>0) low=mid;
                
else hig=mid;
            }

            
if(xmult(board[low].a,board[low].b,toys[i])<0) ans[low]++;
            
else  ans[low+1]++;
        }

        
for(i=0;i<=n;i++)
        
{
            printf(
"%d: %d\n",i,ans[i]);
        }

        flag
=true;
    }

    
return 0;
}
posted @ 2009-10-04 12:14 wyiu 阅读(147) | 评论 (0)编辑 收藏

1.判断左右-叉积

设向量aba×b表示ab的叉积

a×b=xayb-xbya

三维:a×b=(yazb-ybza)i+(xazb-xbza)j+(xayb-xbya)ki,j,kx,y,z轴上的单位向量。

>0ab成右手系

=0ab重叠或平行

<0ab成左手系

此外,叉积还可以用来计算两向量所围成的三角形,S=ab/2

 

2.判断相交

设线段ABCD

(AB×AC)(AB×AD)<0(CD×CA)(CD×CB)<0

 

3.向量夹角-点积

设向量aba·b表示ab的叉积

a·bxaxb+yayb

三维:a·bxaxb+yayb+zazb

α=arccos((a·b)/|a||b|)

>0α是锐角

=0α是直角,ab

<0α是钝角

 

4.P到直线AB的距离=PA×PB/|AB|

P到平面ABC的距离=PA·(AB×AC)/|AB×AC|(注意是三维的叉积和点积)

 

5.判断线段abcd相交的另一种方法

xa+(xb-xa)i=xc+(xd-xc)j

ya+(yb-ya)i=yc+(yd-yc)j

解这个方程组,有:

 

查看更多精彩图片

如果
i,j(0,1),那么abcd相交,且交点坐标是

(xa+(xb-xa)i, ya+(yb-ya)i)

这个方法可以推广到3维情况,只要列个三元方程就行了。

posted @ 2009-10-04 11:31 wyiu 阅读(224) | 评论 (0)编辑 收藏
 int     main(   int   argc   ,   char   *argv[]   ,   char   *envp[]   )  
  main()函数一般用int或者void形的。我比较喜欢用int型定义main。因为在结束的时候可以返回给操作系统一个值以表示执行情况。  
   
  int   argc  
  这个东东用来表示你在命令行下输入命令的时候,一共有多少个参数。比方说你的程序编译后,可执行文件是test.exe  
  D:\tc2>test  
  这个时候,argc的值是1  
  但是  
  D:\tc2>test.exe   myarg1   myarg2  
  的话,argc的值是3。也就是   命令名   加上两个参数,一共三个参数  
   
  char   *argv[]  
  这个东东用来取得你所输入的参数  
  D:\tc2>test  
  这个时候,argc的值是1,argv[0]的值是   "test"  
  D:\tc2>test   myarg1   myarg2  
  这个时候,argc的值是3,argc[0]的值是"test",argc[1]的值是"myarg1",argc[2]的值是"myarg2"。  
  这个东东一般用来为程序提供非常重要的信息,如:数据文件名,等等。  
  如:copy   a.c   b.txt  
  这个时候,a.c和b.txt就是所谓的“非常重要的信息”。不指定这两个文件,你没法进行拷贝。  
  当你的程序用到argc和argv这两个参数的时候,可以简单地通过判断argc的值,来看看程序的参数是否符合要求  
   
  char   *envp[]  
  这个东东相对来说用得比较少。它是用来取得系统的环境变量的。  
  如:在DOS下,有一个PATH变量。当你在DOS提示符下输入一个命令(当然,这个命令不是dir一类的内部命令)的时候,DOS会首先在当前目录下找这个命令的执行文件。如果找不到,则到PATH定义的路径下去找,找到则执行,找不到返回Bad   command   or   file   name  
  在DOS命令提示符下键入set可查看系统的环境变量  
  同样,在UNIX或者LINUX下,也有系统环境变量,而且用得比DOS要多。如常用的$PATH,$USER,$HOME等等。  
  envp保存所有的环境变量。其格式为(UNIX下)  
  PATH=/usr/bin;/local/bin;  
  HOME=/home/shuui  
  即:  
  环境变量名=值  
  DOS下大概也一样。  
  环境变量一般用来为程序提供附加信息。如,你做了一个显示文本的内容的程序。你想控制其一行中显示的字符的个数。你可以自己定义一个环境变量(UNIX下)  
  %setenv   NUMBER   =   10  
  %echo   $NUMBER  
  10  
  然后你可以在程序中读入这个环境变量。然后根据其值决定一行输出多少个字符。这样,如果你不修改环境变量的话,你每次执行这个程序,一行中显示的字符数都是不一样的  
  下面是一个例子程序  
   
  /* argtest.c */  
  #include<stdio.h>  
  int main(   int   argc   ,   char   *argv[]   ,   char   *envp[]   )  
  {  
  int   i;  
   
  printf(   "You   have   inputed   total   %d   argments\n"   ,   argc   );  
  for(   i=0   ;   i<argc   ;   i++)  
  {  
  printf(   "arg%d   :   %s\n"   ,   i   ,   argv[i]   );  
  }  
   
  printf(   "The   follow   is   envp   :\n"   );  
  for(   i=0   ;   *envp[i]!='\0'   ;   i++   )  
  {  
  printf(   "%s\n"   ,   envp[i]   );  
  }  
  return   0;  
  }  
   
   
  D:\>argtest   this   is   a   test   programe   of   main()'s   argments  
  You   have   inputed   total   9   argments  
  arg0   :   D:\TC\NONAME.EXE  
  arg1   :   this  
  arg2   :   is  
  arg3   :   a  
  arg4   :   test  
  arg5   :   programe  
  arg6   :   of  
  arg7   :   main()'s  
  arg8   :   argments  
  The   follow   is   envp   :  
  TMP=C:\WINDOWS\TEMP  
  TEMP=C:\WINDOWS\TEMP  
  PROMPT=$p$g  
  winbootdir=C:\WINDOWS  
  PATH=C:\WINDOWS;C:\WINDOWS\COMMAND  
  COMSPEC=C:\WINDOWS\COMMAND.COM  
  SBPCI=C:\SBPCI  
  windir=C:\WINDOWS  
  BLASTER=A220   I7   D1   H7   P330   T6  
  CMDLINE=noname   this   is   a   test   programe   of   main()'s   argments    
posted @ 2009-10-03 21:44 wyiu 阅读(207) | 评论 (0)编辑 收藏

//第33届ACM-ICPC亚洲预选赛成都赛区解题报告

Problem J
Counting Square
//o(n^2)处理,o(n^3)枚举
#include<iostream>
using namespace std;

int mat[301][301];
int sum[301][301];
int main()
{
    
int t;
    
int r,c;
    
int res=0;
    
int i,j,k;
    scanf(
"%d",&t);
    
while(t--)
    
{
        scanf(
"%d%d",&r,&c);
        memset(sum,
0,sizeof(sum));
        
for(i=1;i<=r;i++)
            
for(j=1;j<=c;j++)
            
{
                scanf(
"%d",&mat[i][j]);
                
if(mat[i][j]==0) mat[i][j]=-1;
                sum[i][j]
=mat[i][j]-sum[i-1][j-1]+sum[i-1][j]+sum[i][j-1];
            }

        res
=0;
        
for(i=1;i<r;i++)
            
for(j=1;j<c;j++)
            
{
                
if(mat[i][j]==-1 || mat[i][j+1]==-1 || mat[i+1][j]==-1 ) continue
                
int all=0,bo=0,in=0;
                
for(k=1;i+k<=&& j+k<=c;k++)
                
{
                    all
=sum[i+k][j+k]-sum[i+k][j-1]-sum[i-1][j+k]+sum[i-1][j-1];
                    
in=sum[i+k-1][j+k-1]-sum[i+k-1][j]-sum[i][j+k-1]+sum[i][j];
                    bo
=all-in;
                    
if(bo<4*k) continue;
                    
else if(in<=1 && in>=-1) res++;
                }

            }


        printf(
"%d\n",res);
    }

    
return 0;
}
posted @ 2009-09-09 23:49 wyiu 阅读(228) | 评论 (0)编辑 收藏
传说可以用kmp的精髓next[]来做,但是怎么都领悟不了,所以就凭感觉直接模拟了
因为s=a^n
取前缀,分别从长度1到strlen,然后与后面剩下的比较,如果ok就说明这个长度是a的最短的长度,然后sterlen(s)/strlen(a)
#include<iostream>
using namespace std;
#define M 1000000

char t[M+1],p[M+1];
int lent,lenp;


bool kmp(char *t,char *p)
{
    
int i,j;
    
for(i=lenp,j=0;i<lent;i++)
    
{
        
if(t[i]!=p[j]) return false;
        
if(t[i]==p[j]) j++;
        
if(j==lenp) j=0;
    }

    
return true;
}



int main()
{
    
int i;
    
while(scanf(" %s",&t)!=EOF && t[0]!='.')
    
{
        lent
=strlen(t);
        
for(i=0;i<lent;i++)
        
{
            p[i]
=t[i];
            p[i
+1]='\0';
            lenp
=i+1;
            
if(lent%lenp==0 && kmp(t,p)) 
            
{
                printf(
"%d\n",lent/lenp);
                
break;
            }

        }

    }
    
    
return 0;
}

posted @ 2009-08-03 14:25 wyiu 阅读(279) | 评论 (0)编辑 收藏
KMP
#include<iostream>
using namespace std;
#define M 1000
//int kmp(char *t,char *p,int pos)
int kmp(char *t,char *p)
{
    
//p模式串,t主串
    
//预处理
    int next[M];
    
//memset(next,0,sizeof(next));
    int  i,j,
        lent
=strlen(t),
        lenp
=strlen(p);
    next[
0]=-1;
    i
=0;j=-1;
    
while(i<lenp-1)
    
{
        
if(j==-1 || p[i]==p[j])
        
{
            
++i;++j;
            
if(p[i]!=p[j]) next[i]=j;
            
else next[i]=next[j];
            
//next[i]=j;
        }

        
else j=next[j];
    }

    
//匹配
    i=0;j=0;
    
while(i<lent && j<lenp)
    
{
        
if(j==-1 || t[i]==p[j]) {++i;++j;}
        
else j=next[j];
    }

    
if(j==lenp) return i-lenp;
    
else return -1;
}





int main()
{
    
char t[100],p[100];
    
while(cin>>t>>p)
        cout
<<kmp(t,p)<<endl;
    
return 0;
}
//
posted @ 2009-07-30 17:22 wyiu 阅读(160) | 评论 (0)编辑 收藏
//
#include<iostream>
#include
<cmath>
using namespace std;
struct BALL
{
    
double x,y,z,r;
}
;
struct Edge
{
    
int x,y;
    
double w;
}
;
BALL ball[
200];
Edge edge[
10000];
int parent[200];
int n;

int find(int c)
{
    
if(parent[c]<0return c;
    
else return find(parent[c]);
}


bool uni(int x,int y)
{
    
int a,b,t;
    a
=find(x);
    b
=find(y);
    
if(a!=b)
    
{
        t
=parent[a]+parent[b];
        
if(parent[a]<parent[b])
        
{        
            parent[b]
=a;
            parent[a]
=t;
        }

        
else 
        
{
            parent[a]
=b;
            parent[b]
=t;
        }

        
return true;
    }

    
return false;
}

double Kruskal(int en)
{
    
int i;
    
double mst=0;
    memset(parent,
-1,sizeof(parent));
    
for(i=0;i<en;i++)
        
if(uni(edge[i].x,edge[i].y))
            mst
+=edge[i].w;
    
return mst;
}

int cmp(const void *a, const void *b)
{
    
double ta=(*(Edge*)a).w,tb=(*(Edge*)b).w;
    
if(ta<tb) return -1;
    
else if(ta==tb) return 0;
    
else return 1;
}



int main()
{
    
int i,j,k;
    
double dx,dy,dz,ts;
    
while(scanf("%d",&n)!=EOF && n)
    
{

        
        
for(i=0;i<n;i++)
            scanf(
"%lf%lf%lf%lf",&(ball[i].x),&(ball[i].y),&(ball[i].z),&(ball[i].r));
        
for(i=0,k=0;i<n;i++)
            
for(j=i+1;j<n;j++)
            
{
                edge[k].x
=i;
                edge[k].y
=j;
                dx
=ball[i].x-ball[j].x;
                dy
=ball[i].y-ball[j].y;
                dz
=ball[i].z-ball[j].z;
                ts
=pow(dx*dx+dy*dy+dz*dz,0.5);
                
if(ts>ball[i].r+ball[j].r) 
                    edge[k
++].w=ts-ball[i].r-ball[j].r;
                
else edge[k++].w=0;
            }

        qsort(edge,k,
sizeof(edge[0]),cmp);
        printf(
"%.3lf\n",Kruskal(k));
    }


}
posted @ 2009-07-29 10:05 wyiu 阅读(155) | 评论 (0)编辑 收藏

#include<iostream>
#include
<cmath>
using namespace std;
#define M 40000
__int64 sum[M
+1];
__int64 len[M
+1];
void init()
{
    
int i;
    len[
0]=0;
    sum[
0]=0;
    
for(i=1;i<=M;i++)
    
{
        len[i]
=len[i-1]+(int)log10(double(i))+1;
        sum[i]
=sum[i-1]+len[i];
    }


}

int search(__int64 n)
{
    __int64 k,w,li,i,j;
    k
=1;
    
while(sum[k]<n) k++;//di k zu
    w=n-sum[k-1];//
    i=1;
    
while(w-int(log10(double(i))+1)>0
    
{
        w
-=int(log10(double(i))+1);
        i
++;
    }

    li
=(int)log10((double)i)+1;
    
for(j=1;j<=li-w;j++)
        i
/=10;
    
return i%10;
}


    
int main()
{
    init();
    
int t;
    __int64 n;
    
    scanf(
"%d",&t);

    
for(;t--;)
    
{
        scanf(
"%I64d",&n);
        printf(
"%d\n",search(n));
    }

    
return 0;
}


posted @ 2009-07-28 09:43 wyiu 阅读(412) | 评论 (2)编辑 收藏
仅列出标题
共10页: 1 2 3 4 5 6 7 8 9 Last