随笔分类 - 数学
摘要:http://poj.org/problem?id=2420这个题是一道模拟退火题,但我用的是最小覆盖圆解决的;这是我认为写得比较好的文章,在这里与大家分享。这道题其实就是求一个最小外接圆圆心和半径。所求点即是圆心,距离就是半径。点集的最小外接圆,其实就是点集的最小圆覆盖,就是找一个最小的圆,将所有点覆盖掉。这道题的题意是求一个点,使得到点集的最远点距离最近,下边我用我的方式,不严谨的证明一下。先证明最小外接圆的圆心到其最远的点距离最近。可知最小外接圆上最少有两个点,如果是两个点,必然在一条直径上,否则就至少有三个点,且这三个点之间相对于圆心的夹角两两不超过180度。这点很好证明。如果不满足上
阅读全文
摘要:该题用的知识是:如果点在三角形内,则这个点为顶点的三个角之和为360度。#include<stdio.h>#include<stdlib.h>#include<math.h>double x1,Y1,x2,y2,x3,y3,x,y;double length( double a1,double b1,double a2,double b2 ){ return ( a1-a2 )*( a1-a2 )+( b1-b2 )*( b1-b2 ) ; }double area( double a1,double b1,double a2,double b2,doubl
阅读全文
摘要:这题给定的数一定能被N整除,最后要%1000003,那么我们就%1000003*N;这样我们就不要担心数据过大的问题;#include<stdio.h>#include<stdlib.h>int main(){ int T,n,x; __int64 num[40002]; scanf( "%d",&T ); for( int i=1; i<=T; i++ ) { scanf( "%d",&n ); __int64 ans=0,m=1000003; m*=n; num[0]=1; for( int j=1;..
阅读全文
摘要:该题就从最高位取余,余数再乘以10就可以了;#include<stdio.h>#include<stdlib.h>#include<string.h>int main(){ int n,m; char num[1024]; while( scanf( "%s%d",num,&m )!=EOF ) { int len=strlen( num ); int n=num[0]-'0',i=1; while( i<len ) { n=n*10+num[i]-'0'; n%=m; i++; } prin
阅读全文
摘要:#include<stdio.h>#include<stdlib.h>int num[1024][300]={0};int main(){ int n; num[0][1]=1;num[1][1]=1;num[2][1]=2;num[3][1]=4; for( int i=4; i<=1000; i++ ) { for( int j=1;j<300; j++ ) { num[i][j]+=num[i-1][j]+num[i-2][j]+num[i-4][j]; num[i][j+1]=num[i][j]/10; num[i][j]%=10; } } whil
阅读全文
摘要:求任意多边形的重心已知一多边形没有边相交,质量分布均匀。顺序给出多边形的顶点坐标,求其重心。分析:求多边形重心的题目大致有这么几种:1,质量集中在顶点上。n个顶点坐标为(xi,yi),质量为mi,则重心 X = ∑( xi×mi ) / ∑mi Y = ∑( yi×mi ) / ∑mi 特殊地,若每个点的质量相同,则 X = ∑xi / n Y = ∑yi / n2,质量分布均匀。这个题就是这一类型,算法和上面的不同。 特殊地,质量均匀的三角形重心: X = ( x0 + x1 + x2 ) / 3 Y = ( y0 + y1 + y2 ) / 33,质量分布不均匀。只能用
阅读全文
摘要:算法简单说明: 首先判断以两条线段为对角线的矩形是否相交,如果不相交两条线段肯定也不相交。(所谓以a1b2为对角钱的矩形就是以两边长为|a1.x – b2.x|和|a1.y – b2.y|以及a1b2为对角线的矩形)。如果相交的话,利用矢量叉乘判断两条线段是否相互跨越,如果相互跨越显然就相交,反之则不相交。算法不难,但是一些特殊情况需要考虑到,比如两条相段共线且在断点处相交。下面的代码经过测试了,应该没有bug,如果你真的发现了bug请告诉我:) /******************************************************** * * * 返回(P1-P0)*
阅读全文
摘要:x 、y、n都是正整数,并且 显然,x >= n , y >= n ,现在假设 y = n +k (k为正整数) ,那么带入公式,可以得出 x = (n*(n+k))/k = n*n/k + n; 由于x 是正整数,现在的关键问题就是要求出 n*n/ k 有多少组正整数的可能,显然,所要求的就是 n*n 因子的个数// 问题已经非常接近答案了,但是最后还有一个问题,n<= 10^9 , 那么n*n <= 10^18 ,对于一个这么大的数字怎样才能求出它因子的个数呢?命题1: 一个正整数 n 可以用素因子唯一表示为 p1^r1 * p2^r2 * ... pk^rk (其
阅读全文
摘要:#include<stdio.h>#include<stdlib.h>int main(){ double k,l,s,w; while( scanf( "%lf%lf%lf%lf",&k,&l,&s,&w ),k||l||s||w ) { if( l>=s )//当绳子大于桥的高度就只要判断势能转化成动能 { if(s>(100/19.62)) printf( "Killed by the impact.\n" ); else printf( "James Bond surv
阅读全文
摘要:该题只要注意前面几个精度就可以。#include<stdio.h>#include<stdlib.h>int main(){ int n=1,a[10]={1}; while( n<10 ) { a[n]=a[n-1]*n; n++; } printf( "n e\n" ); printf( "- -----------\n" ); printf( "0 1\n" ); printf( "1 2\n" ); printf( "2 2.5\n" ); n=3; dou
阅读全文
摘要:该题是一题找规律题,当n与m都是偶数或是倍数是就存在这样的洞,方法一:#include<stdio.h>#include<stdlib.h>int main(){ int n,m,N; scanf( "%d",&N ); for( int i=1; i<=N; i++ ) { scanf( "%d%d",&n,&m ); if( n==1 || m==1) printf( "NO\n" ); else { if( (n%2==0) && (m%2==0) ) pri
阅读全文
摘要:该题一直TLE,后来把qsort改成sort就过了,悲伤呀,该题用到DP中的分治法,先看看这题分治法的原理:<!--[if !supportLists]-->1、<!--[endif]-->问题综述最接近点对问题的提法是:给定平面上n个点,找其中的一对点,使得在n个点组成的所有点对中,该点对间的距离最小。实际情况下,最接近点对可能多于一对,为简单起见 ,我们只找其中的一对作为问题的解。有一个最直观的方法就是将每一点与其他n-1个点的距离算出,找出达到最小距离的两点即可。然而,这样做效率太低,我们想到用递归法来解决这个问题。2、 用递归法解决将所给的平面上n个点的集合S分
阅读全文

浙公网安备 33010602011771号