acm训练题-计算两点之间的距离

合集下载

acm数学竞赛试题

acm数学竞赛试题

acm数学竞赛试题
ACM数学竞赛试题通常涉及各种数学领域,包括但不限于代数、几何、概率统计和组合数学等。

以下是一些经典的ACM数学竞赛试题:
1. 平面上n个点的k距离和最小值问题:给定平面上n个点,对于每个点,计算它到其他所有点的距离,然后求出这些距离中的k个最小值。

问题是:如何有效地计算这k个最小值?
2.最长公共子序列问题:给定两个序列,找出它们的最长公共子序列。

例如,对于序列
A = [1, 2, 3, 4] 和
B = [2, 3, 4, 5],最长公共子序列是[2, 3, 4]。

3. 凸包问题:给定平面上的一组点,找到一个最小的凸多边形,使得这个多边形能够包含这组点中的所有点。

4. 最短路问题:给定一个有向图,其中每条边都有一个非负的权重,找出图中任意两点之间的最短路径。

5. 子集和问题:给定一个正整数数组和一个目标值,判断数组中是否存在和为目标值的两个非空子集。

例如,给定数组[1, 2, 3, 4] 和目标值7,判断是否存在两个子集,它们的和分别为7。

以上只是ACM数学竞赛试题的一部分,实际上还有更多涉及数学各个领域的题目。

要提高解决这类问题的能力,需要不断练习和研究。

初一数学模拟试卷

初一数学模拟试卷

初一数学模拟试卷考试范围:xxx ;考试时间:xxx 分钟;出题人:xxx 姓名:___________班级:___________考号:___________1.答题前填写好自己的姓名、班级、考号等信息 2.请将答案正确填写在答题卡上一、选择题1.已知两个同心圆的圆心为O ,半径分别是2和3,且2<OP <3,那么点P 在( )A .小圆内B .大圆内C .小圆外大圆内D .大圆外 2.下列各组的两个数中,运算后的结果相等的是( ) A .和 B .和C .和D .和3.已知AB=10cm ,在AB 的延长线上取一点C ,使AC=16cm ,则线段AB 的中点与AC 的中点的距离为( ) A .5cm B .4cm C .3cm D .2cm4.下列各对数中,相等的一对是( ) A .与B .与C .与D .与5.如图为我县十二月份某一天的天气预报,该天最高气温比最低气温高( )A .﹣3℃B .7℃C .3℃D .﹣7℃6.如图,BF 上有两点D 、C ,AC 与DE 相交于点G ,则下列三角形的表示中,不能在图中找到的是( )A. △ABCB. △DCGC. △BCDD. △DEF7.在同一平面上,若∠BOA =60.3°,∠BOC =20°30′,则∠AOC 的度数是( )A .80.6°B .40°C .80.8°或39.8°D .80.6°或40°8.一个三角形的两个内角分别为55°和65°,这个三角形的外角不可能是( )A .115°B .120°C .125°D .130°9.已知一个数a 的近似值为1.50,那么数a 的准确值的范围是( ) A .1.495<a <1.505 B .1 .495≤a <1.505 C .1.45≤a <1.55 D .1.45<a <1.5510.观察下列图形,并阅读图形下面的相关文字,如图所示:两条直线相交,三条直线相交,四条直线相交,最多有一个交点,最多有三个交点;最多有6个交点,像这样,10条直线相交,最多交点的个数是( )A .40个B .45个C .50个D .55个二、判断题11.解一元一次方程(1) (2)12.邻居张叔叔星期天准备做两件事:一是到邮局拿某杂志社寄给自己的论文稿费,二是买礼物送爸妈和女友.(1)邻居张叔叔先到邮局拿论文稿费.国家规定稿费超过一定数额需缴纳所得税,有关规定如下表:张叔叔从邮局拿到税后稿费为3380元,问该杂志社给张叔叔的税前论文稿费为多少元?(2)邻居张叔叔拿到稿费后到商店准备为爸妈买四盒“补雪”牌补品,同时为女友买三瓶相同的“露”牌化妆品.张叔叔对比了甲、乙两家商店这两种商品的标价,发现“补雪”牌补品都是每盒300元,“露”牌化妆品都是每瓶200元.现在两家商店正在搞促销活动,促销办法如下表:请你帮助邻居张叔叔出个主意,要在这两个店买,应怎样买最省钱?共需多少钱,并写出购买方案.13.为响应国家要求中小学生每天锻炼1小时的号召,某校开展了形式多样的“阳光体育运动”活动,小明对某班同学参加锻炼的情况进行了统计,并绘制了下面的图1和图2.(1)该班共有多少名学生?(2)请在图1中将“乒乓球”部分的图形补充完整;(3)若全年级共有1200名学生,估计全年级参加乒乓球活动的学生有多少名?(4)求出扇形统计图中表示“足球”的扇形的圆心角度数.14.如图,点C 在线段AB 上,AC=16cm ,CB=12cm ,点M 、N 分别是AC 、BC 的中点.(1)求线段MN 的长;(2)若C 为线段AB 上任一点,满足AC+CB="a" cm ,其它条件不变,你能猜想MN 的长度吗?并说明理由.(3)若C 在线段AB 的延长线上,且满足AC ﹣BC="b" cm ,M 、N 分别为AC 、BC 的中点,你能猜想MN 的长度吗?请画出图形,写出你的结论,不要说明理由. 15.若的积中不含与项,(1)求、的值; (2)求代数式的值;三、填空题16.在方格图当中,需要添加哪几个正方形,才能使其构成正方体的展开图,它们为__________.(填序号)17.单项式的系数是 .18.如图,若AB ∥CD ,那么∠3=∠4,依据是 .19.(2015秋•泗县校级月考)有A、B两点,在数轴上分别表示实数a、b,若a的绝对值是b的绝对值的4倍,且A、B两点的距离是15,求a、b的值.(1)若A、B两点在原点的同侧:A、B两点都在原点的左侧时,a= ,b= ,A、B两点都在原点的右侧时,a= ,b= .(2)若A、B两点在原点的两侧:A在原点的左侧、B在原点的右侧时,a= ,b= ,A在原点的右侧、B在原点的左侧时,a= ,b= .20.小亮将两张长方形纸片如图所示摆放,使小长方形纸片的一个顶点正好落在大长方形纸片的边上,测得∠1=,则∠2= °.四、计算题21.(2015•重庆模拟)解方程:2﹣=.22.(x+2)(2x-3)- x(x+1)五、解答题23.3x2·x n-2+3(-x) 2·x n-3·(-x)24.若是方程组的解,求、的值。

计算两点之间的最短距离

计算两点之间的最短距离

计算两点之间的最短距离题⽬链接:题⽬⼤意:给定N个点的坐标,找出距离最短的两个点的序号.如果最短距离相同,输出序号最⼩的⼀组.题⽬要求输出三种不同计算⽅式下的最短距离序号:欧⼏⾥得距离:Math.sqrt(|x2-x1|2+|y2-y1|2)曼哈顿距离:|x2-x1|+|y2-y1|棋盘距离:Math.max(|x2-x1|,|y2-y1|)因为N的个数是5000个,可以直接双重循环取得最⼩距离. 单纯的理解⼀下三种距离.Accept代码:import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.List;import java.util.StringTokenizer;public class source {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));StringTokenizer st = new StringTokenizer(br.readLine());int N = Integer.parseInt(st.nextToken());int[][] points = new int[N+1][2];for(int i = 1;i<=N;i++){st = new StringTokenizer(br.readLine());points[i] = new int[]{Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken())};}List<int[]> result = getEuclidPosition(points);for(int[] ans:result){System.out.println(ans[0]+" "+ans[1]);}}private static List<int[]> getEuclidPosition(int[][] points){double minEuclidDistance = Integer.MAX_VALUE;int[] euclidPosition = new int[2];double minCityDistance = Integer.MAX_VALUE;int[] cityPosition = new int[2];double minChessDistance = Integer.MAX_VALUE;int[] chessPosition = new int[2];CalcMinPoint calcMinPointEuclid;CalcMinPoint calcMinPointCity;CalcMinPoint calcMinPointChess;for(int i = 1;i<points.length;i++){for(int j = 1;j<points.length;j++){if(i == j){continue;}double euclidDistance = getEuclidDistance(points[i],points[j]);double cityDistance = getCityDistance(points[i],points[j]);double chessDistance = getChessDistance(points[i],points[j]);calcMinPointEuclid = new CalcMinPoint(minEuclidDistance, euclidPosition, i, j, euclidDistance).invoke(); minEuclidDistance = calcMinPointEuclid.getMinEuclidDistance();euclidPosition = calcMinPointEuclid.getEuclidPosition();calcMinPointCity = new CalcMinPoint(minCityDistance, cityPosition, i, j, cityDistance).invoke(); minCityDistance = calcMinPointCity.getMinEuclidDistance();cityPosition = calcMinPointCity.getEuclidPosition();calcMinPointChess = new CalcMinPoint(minChessDistance, chessPosition, i, j, chessDistance).invoke(); minChessDistance = calcMinPointChess.getMinEuclidDistance();chessPosition = calcMinPointChess.getEuclidPosition();}}List<int[]> result = new ArrayList<int[]>();result.add(euclidPosition);result.add(cityPosition);result.add(chessPosition);return result;}private static double getChessDistance(int[] point, int[] point1) {return Math.max(Math.abs(point[0]-point1[0]),Math.abs(point[1]-point1[1]));}private static double getCityDistance(int[] point, int[] point1) {return Math.abs(point[0]-point1[0])+Math.abs(point[1]-point1[1]);}private static double getEuclidDistance(int[] p1, int[] p2){return Math.pow(p1[0]-p2[0],2)+Math.pow(p1[1]-p2[1],2);}private static class CalcMinPoint {private double minEuclidDistance;private int[] euclidPosition;private int i;private int j;private double euclidDistance;public CalcMinPoint(double minEuclidDistance, int[] euclidPosition, int i, int j, double euclidDistance) { this.minEuclidDistance = minEuclidDistance;this.euclidPosition = euclidPosition;this.i = i;this.j = j;this.euclidDistance = euclidDistance;}public double getMinEuclidDistance() {return minEuclidDistance;}public int[] getEuclidPosition() {return euclidPosition;}public CalcMinPoint invoke() {if(minEuclidDistance > euclidDistance){minEuclidDistance = euclidDistance;if(i < j){euclidPosition = new int[]{i,j};}else{euclidPosition = new int[]{j,i};}}else if(minEuclidDistance == euclidDistance){int position0 = -1;int position1 = -1;if(i<j){ position0 = i; position1 = j; } else{ position0 = j; position1 = i; } if(euclidPosition[0]>position0){ euclidPosition = new int[]{position0,position1};}else if(euclidPosition[0] == position0 && euclidPosition[1]>position1){euclidPosition = new int[]{position0,position1};}}return this;}}}。

ACM程序竞赛计算几何超全模板

ACM程序竞赛计算几何超全模板

/*计算几何目录㈠点的基本运算1. 平面上两点之间距离12. 判断两点是否重合13. 矢量叉乘14. 矢量点乘25. 判断点是否在线段上26. 求一点饶某点旋转后的坐标27. 求矢量夹角2㈡线段及直线的基本运算1. 点与线段的关系32. 求点到线段所在直线垂线的垂足43. 点到线段的最近点44. 点到线段所在直线的距离45. 点到折线集的最近距离46. 判断圆是否在多边形内57. 求矢量夹角余弦58. 求线段之间的夹角59. 判断线段是否相交610.判断线段是否相交但不交在端点处611.求线段所在直线的方程612.求直线的斜率713.求直线的倾斜角714.求点关于某直线的对称点715.判断两条直线是否相交及求直线交点716.判断线段是否相交,如果相交返回交点7㈢多边形常用算法模块1. 判断多边形是否简单多边形82. 检查多边形顶点的凸凹性93. 判断多边形是否凸多边形94. 求多边形面积95. 判断多边形顶点的排列方向,方法一106. 判断多边形顶点的排列方向,方法二107. 射线法判断点是否在多边形内108. 判断点是否在凸多边形内119. 寻找点集的graham算法1210.寻找点集凸包的卷包裹法1311.判断线段是否在多边形内1412.求简单多边形的重心1513.求凸多边形的重心1714.求肯定在给定多边形内的一个点1715.求从多边形外一点出发到该多边形的切线1816.判断多边形的核是否存在19㈣圆的基本运算1 .点是否在圆内202 .求不共线的三点所确定的圆21㈤矩形的基本运算1.已知矩形三点坐标,求第4点坐标22㈥常用算法的描述22㈦补充1.两圆关系:242.判断圆是否在矩形内:243.点到平面的距离:254.点是否在直线同侧:255.镜面反射线:256.矩形包含:267.两圆交点:278.两圆公共面积:289. 圆和直线关系:2910. 内切圆:3011. 求切点:3112. 线段的左右旋:3113.公式:32*//* 需要包含的头文件*/#include <cmath >/* 常用的常量定义*/const double INF = 1E200const double EP = 1E-10const int MAXV = 300const double PI = 3.14159265/* 基本几何结构*/struct POINT{double x;double y;POINT(double a=0, double b=0) { x=a; y=b;} //constructor};struct LINESEG{POINT s;POINT e;LINESEG(POINT a, POINT b) { s=a; e=b;}LINESEG() { }};struct LINE // 直线的解析方程a*x+b*y+c=0 为统一表示,约定a >= 0{double a;double b;double c;LINE(double d1=1, double d2=-1, double d3=0) {a=d1; b=d2; c=d3;}};/*********************** ** 点的基本运算** ***********************/double dist(POINT p1,POINT p2) // 返回两点之间欧氏距离{return( sqrt( (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y) ) );}bool equal_point(POINT p1,POINT p2) // 判断两个点是否重合{return ( (abs(p1.x-p2.x)<EP)&&(abs(p1.y-p2.y)<EP) );}/****************************************************************************** r=multiply(sp,ep,op),得到(sp-op)和(ep-op)的叉积r>0:ep在矢量opsp的逆时针方向;r=0:opspep三点共线;r<0:ep在矢量opsp的顺时针方向******************************************************************************* /double multiply(POINT sp,POINT ep,POINT op){return((sp.x-op.x)*(ep.y-op.y)-(ep.x-op.x)*(sp.y-op.y));}/*r=dotmultiply(p1,p2,op),得到矢量(p1-op)和(p2-op)的点积,如果两个矢量都非零矢量r<0:两矢量夹角为锐角;r=0:两矢量夹角为直角;r>0:两矢量夹角为钝角******************************************************************************* /double dotmultiply(POINT p1,POINT p2,POINT p0){return ((p1.x-p0.x)*(p2.x-p0.x)+(p1.y-p0.y)*(p2.y-p0.y));}/****************************************************************************** 判断点p是否在线段l上条件:(p在线段l所在的直线上) && (点p在以线段l为对角线的矩形内)******************************************************************************* /bool online(LINESEG l,POINT p){return( (multiply(l.e,p,l.s)==0) &&( ( (p.x-l.s.x)*(p.x-l.e.x)<=0 )&&( (p.y-l.s.y)*(p.y-l.e.y)<=0 ) ) ); }// 返回点p以点o为圆心逆时针旋转alpha(单位:弧度)后所在的位置POINT rotate(POINT o,double alpha,POINT p){POINT tp;p.x-=o.x;p.y-=o.y;tp.x=p.x*cos(alpha)-p.y*sin(alpha)+o.x;tp.y=p.y*cos(alpha)+p.x*sin(alpha)+o.y;return tp;}/* 返回顶角在o点,起始边为os,终止边为oe的夹角(单位:弧度)角度小于pi,返回正值角度大于pi,返回负值可以用于求线段之间的夹角原理:r = dotmultiply(s,e,o) / (dist(o,s)*dist(o,e))r'= multiply(s,e,o)r >= 1 angle = 0;r <= -1 angle = -PI-1<r<1 && r'>0 angle = arccos(r)-1<r<1 && r'<=0 angle = -arccos(r)*/double angle(POINT o,POINT s,POINT e){double cosfi,fi,norm;double dsx = s.x - o.x;double dsy = s.y - o.y;double dex = e.x - o.x;double dey = e.y - o.y;cosfi=dsx*dex+dsy*dey;norm=(dsx*dsx+dsy*dsy)*(dex*dex+dey*dey);cosfi /= sqrt( norm );if (cosfi >= 1.0 ) return 0;if (cosfi <= -1.0 ) return -3.1415926;fi=acos(cosfi);if (dsx*dey-dsy*dex>0) return fi; // 说明矢量os 在矢量oe的顺时针方向return -fi;}/*****************************\* ** 线段及直线的基本运算** *\*****************************//* 判断点与线段的关系,用途很广泛本函数是根据下面的公式写的,P是点C到线段AB所在直线的垂足AC dot ABr = ---------||AB||^2(Cx-Ax)(Bx-Ax) + (Cy-Ay)(By-Ay)= -------------------------------L^2r has the following meaning:r=0 P = Ar=1 P = Br<0 P is on the backward extension of ABr>1 P is on the forward extension of AB0<r<1 P is interior to AB*/double relation(POINT p,LINESEG l){LINESEG tl;tl.s=l.s;tl.e=p;return dotmultiply(tl.e,l.e,l.s)/(dist(l.s,l.e)*dist(l.s,l.e));}// 求点C到线段AB所在直线的垂足PPOINT perpendicular(POINT p,LINESEG l){double r=relation(p,l);POINT tp;tp.x=l.s.x+r*(l.e.x-l.s.x);tp.y=l.s.y+r*(l.e.y-l.s.y);return tp;}/* 求点p到线段l的最短距离,并返回线段上距该点最近的点np注意:np是线段l上到点p最近的点,不一定是垂足*/double ptolinesegdist(POINT p,LINESEG l,POINT &np){double r=relation(p,l);if(r<0){np=l.s;return dist(p,l.s);}if(r>1){np=l.e;return dist(p,l.e);}np=perpendicular(p,l);return dist(p,np);}// 求点p到线段l所在直线的距离,请注意本函数与上个函数的区别double ptoldist(POINT p,LINESEG l){return abs(multiply(p,l.e,l.s))/dist(l.s,l.e);}/* 计算点到折线集的最近距离,并返回最近点.注意:调用的是ptolineseg()函数*/double ptopointset(int vcount,POINT pointset[],POINT p,POINT &q) {int i;double cd=double(INF),td;LINESEG l;POINT tq,cq;for(i=0;i<vcount-1;i++)l.s=pointset[i];l.e=pointset[i+1];td=ptolinesegdist(p,l,tq);if(td<cd){cd=td;cq=tq;}}q=cq;return cd;}/* 判断圆是否在多边形内.ptolineseg()函数的应用2 */bool CircleInsidePolygon(int vcount,POINT center,double radius,POINT polygon[]){POINT q;double d;q.x=0;q.y=0;d=ptopointset(vcount,polygon,center,q);if(d<radius||fabs(d-radius)<EP)return true;elsereturn false;}/* 返回两个矢量l1和l2的夹角的余弦(-1 --- 1)注意:如果想从余弦求夹角的话,注意反余弦函数的定义域是从0到pi */double cosine(LINESEG l1,LINESEG l2){return (((l1.e.x-l1.s.x)*(l2.e.x-l2.s.x) +(l1.e.y-l1.s.y)*(l2.e.y-l2.s.y))/(dist(l1.e,l1.s)*dist(l2.e,l2.s))) );}// 返回线段l1与l2之间的夹角单位:弧度范围(-pi,pi)double lsangle(LINESEG l1,LINESEG l2){POINT o,s,e;o.x=o.y=0;s.x=l1.e.x-l1.s.x;s.y=l1.e.y-l1.s.y;e.x=l2.e.x-l2.s.x;e.y=l2.e.y-l2.s.y;return angle(o,s,e);// 如果线段u和v相交(包括相交在端点处)时,返回true////判断P1P2跨立Q1Q2的依据是:( P1 - Q1 ) ×( Q2 - Q1 ) * ( Q2 - Q1 ) ×( P2 - Q1 ) >= 0。

exercise1_ACM

exercise1_ACM

第一次作业1、平面分割方法设有n条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且任何三条封闭曲线不相交于同一点,问这些封闭曲线把平面分割成的区域个数。

输入示例:3输出示例:8要求:用两种方法:(1)得到第n项与其之前已知项之间的关系,程序用递归实现(2)得到第n项的通项公式,程序直接实现。

解:每增加一条封闭曲线该曲线就会与之前的每条曲线产生两个交点,所以会增加2(n-1)个交点。

(1)递归关系:f(n)=f(n-1)+2(n-1)(增加几个交点就增加几个平面),f(1)=2 (2)通项公式:f(n)=n(n-1)+2//(1)//平面分割方法int countArea(int n)//递归法{if(n==1)return 2;elsereturn countArea(n-1)+2*(n-1);}//通项公式法an=2+n(n-1)int countArea2(int n){return 2+n*(n-1);}2、LELE的RPG难题有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.输入示例:3输出示例:6解:递归分析:从f(n-1)增加到f(n)分两种情况:(1)一种是直接在所有已经排好了的f(n-1)序列中插入唯一一个第三色有f(n-1)种;(2)另外是在已经排好了的f(n-2)序列中,插入与缝隙两边其中一个颜色相同的颜色,然后再插入第n个颜色且只需与第n-1种颜色不同有两种,故有2f(n-2)种;递归关系:f(n)=f(n-1)+2f(n-2),(n>=2)//(2)LELE的RPG难题int countColor(int n){if(n==2)return 6;else if(n==3)return 6;elsereturn countColor(n-1)+*countColor(n-2);}3、假设一个有序数组A[0], A[1], …, A[N-1],编写一个函数int find(int A[], int x),确定一个整数x是否在数组A中,如果在,则返回其位置,否则返回-1//有序数组元素查找-二分查找int find(int A[],int n){//sizeof(A)sizeof写进函数得不到数组所占的内存数,而仅是一个指针的内存大小 int length=0;//参数数组长度for(int i=0;A[i]!=0;i++){length++;}int left=0,mid,right=length-1;while(left<=right){mid=(left+right)/2;if(n<A[mid])right=mid-1;else if(n>A[mid]){left=mid+1;}elsereturn mid;}return -1;}4、假设数组a中的元素是按从小到大顺序排列的,函数find(int a[], int n, int &i, int &j, int x)利用二分搜索法确定x是否在含有n个元素的数组a中,如果不在,则参数i为小于x的最大元素的下标,参数j为大于x的最小元素的下标。

北师大专题17 线段中点或角的计数问题含答案

北师大专题17 线段中点或角的计数问题含答案

专题17 线段中点或角的计数问题一、线段中点问题1. 如图,点C为线段AB上一点,AC=8cm,CB=6cm,点M、N分别是AC、BC的中点.(1)求线段MN的长;(2)若AC+BC=acm,其他条件不变,直接写出线段MN的长为.【答案】(1)7cm;(2)12a cm.【解析】【分析】(1)根据线段中点的性质(可得CM(CN的长(根据线段的和差(可得答案((2)根据线段中点的性质(可得CM(CN的长(根据线段的和差(可得答案(【详解】(1(∵点M(N分别是AC(BC的中点(AC=8(CB=6(∴CM=12AC=12×8=4(CN=12BC=12×6=3(∴MN=CM+CN=4+3=7cm((2(∵点M(N分别是AC(BC的中点(∴CM=12AC(CN=12BC(∴MN=CM+CN=1 2AC+12BC=12(AC+BC(=12AB=12a(cm((故答案为12a cm(【点睛】本题考查了两点间的距离(连接两点间的线段的长度叫两点间的距离(2. 画线段MN=3㎝,在线段MN上取一点Q,使MQ=NQ,延长线段MN至点A,使AN=MN;延长线段NM至点B,使BN=3BM,根据所画图形计算:(1)线段BM的长度;(2)线段AN的长度;(3)试说明Q是哪些线段的中点?图中共有多少条线段?它们分别是?【答案】(1)1.5㎝;(2)1.5㎝;(3)由图可知,BM=MQ=NQ=NA所以Q既是线段MN的中点,也是线段AB的中点.图中共有10条线段,它们分别是:BM、BQ、BN、BA、MQ、MN、MA、QN、QA、NA.【解析】【分析】先根据题意画出几何图形(1)根据BN=3BM可得到MN=2BM,而MN=3cm,即可得到线段BM的长;(2)根据AN=12MN即可得到线段AN的长;(3)由(1)与(2)得到BM=MQ=NQ=NA,即QB=QA,QM=QN,则点Q是线段MN的中点,也是线段AB的中点;图形中共有BM、BQ、BN、BA、MQ、MN、MA、QN、QA、NA10条线段.【详解】如图所示:(1)(MN=3cm,BN=3BM,(BM=12MN=12×3=1.5(cm );(2)(MN=3cm,AN=12 MN(AN=1.5cm;(3)由图可知,BM=MQ=NQ=NA,(QB=QA,QM=QN,(点Q既是线段MN的中点,也是线段AB的中点;图中共有10条线段,它们分别是:BM、BQ、BN、BA、MQ、MN、MA、QN、QA、NA.【点睛】本题考查了两点间的距离、射线与线段的定义,解题的关键是熟记两点间的距离的定义:两点的连线段的长叫两点间的距离.二、线段分点问题3. 如图,B,C两点把线段AD分成2∶4∶3的三部分,M是线段AD的中点,CD =6 cm,求线段MC的长.【答案】3cm【解析】【分析】设AB=2x,BC=4x,CD=3x,再根据CD=6cm求出x的值,故可得出线段AD的长度,再根据M是AD的中点可求出MD的长,由MC=MD-CD即可得出结论.【详解】解:∵B,C两点把线段AD分成2:4:3三部分,∴设AB=2x,BC=4x,CD=3x,∵CD=6cm,即3x=6cm,解得x=2cm,∴AD=2x+4x+3x=9x=9×2=18cm,∵M是AD的中点,∴MD=12AD=12×18=9cm,∴MC=MD-CD=9-6=3cm.【点睛】本题考查的是两点间的距离,在解答此类问题时要注意各线段之间的和、差及倍数关系.4. A,B两点在数轴上的位置如图所示,O为原点,现A,B两点分别以1个单位长度/秒的速度同时向左运动.(1)几秒后,原点恰好在A,B两点正中间?(2)几秒后,恰好有OA:OB=1:2.【答案】(1)95(1.8)秒;(2)1或9秒.【解析】【分析】(1)根据原点恰好在两点正中间,分别表示出原点两旁的长度求出即可;(2)利用①B与A相遇前,②B与A相遇后分别表示出线段长度得出等式即可.【详解】(1)设运动时间为x秒,根据题意得出:x+3=12-4x,解得:x=1.8,答:1.8秒后,原点恰好在两点正中间;(2)设运动时间为x秒,分两种情况:①B与A相遇前:12-4x=2(x+3),解得:x=1,②B与A相遇后:4x-12=2(x+3),解得:x=9,答:1秒或9秒后,恰好有OA:OB=1:2.【点睛】此题主要考查了一元一次方程的应用,利用分类讨论得出是解题关键.三、线段条数的计数问题5. 先阅读文字,再解答问题.如图,在一条直线上取两点,可以得到1条线段,在一条直线上取三点可以得到3条线段,其中以A 1为端点的向右的线段有2条,以A 2为端点的向右的线段有1条,所以共有2+1=3(条).(1)在一条直线上取四个点,以A 1为端点的向右的线段有______条,以A 2为端点的向右的线段有______条,以A 3为端点的向右的线段有______条,共有______+______+______=______(条).(2)在一条直线上取五个点,以A 1为端点的向右的线段有______条,以A 2为端点的向右的线段有________条,以A 3为端点的向右的线段有________条,以A 4为端点的向右的线段有______条,共有________+________+________+________=______(条).(3)在一条直线上取n 个点(n≥2),共有________条线段.(4)乘火车从A 站出发,沿途经过5个车站方可到达B 站,那么A ,B 两站之间最多有多少种不同的票价?需要安排多少种不同的车票?(只考虑硬座情况) 【答案】(1)3;2;1;3;2;1;6;(2)4;3;2;1;4;3;2;1;10;(3)(1)2n n -;(4)21种;42种 【解析】【分析】(1)分别找出以A 1,A 2,A 3为端点向右的线段数,再求和即可得到结论; (2)分别找出以A 1,A 2,A 3,A 4为端点向右的线段数,再求和即可得到结论; (3)由前面的规律可看出,当直线上有n 个点时,线段总数为(1)2n n -; (4)画出图形,结合图形,表示出线段的条数,就可以知道车票的种数,从而可得结论.【详解】解:(1)在一条直线上取四个点,如图以A 1为端点的向右的线段有12A A ,13A A ,41A A 共3条,以A 2为端点的向右的线段有23A A ,24A A 共2条,以A 3为端点的向右的线段有34A A ,1条,共有3+2+1=6(条).(2)在一条直线上取五个点,如图,以A 1为端点的向右的线段有12A A ,13A A ,41A A ,15A A 共4条,以A 2为端点的向右的线段有23A A ,24A A ,25A A 共3条,以A 3为端点的向右的线段有34A A ,35A A ,共2条,以A 4为端点的向右的线段有45A A ,1条,共有4+3+2+1=10(条).(3)在一条直线上取n 个点(n≥2),共有(1)2n n -条线段. (4)从A 站出发,沿途经过5个车站到达B 站,类似于一条直线上有7个点,如图,此时共有线段7(71)2⨯-=21(条),即A ,B 两站之间最多有21种不同的票价.因为来往两站的车票起点与终点不同,所以A ,B 两站之间需要安排21×2=42(种)不同的车票.【点睛】此题主要考查学生数线段条数及规律型题的掌握情况,找到线段条数与直线上点的个数之间的联系,是解题的关键.四、平面内直线相交所得交点与平面的计数问题6. 为了探究同一平面内的几条直线相交最多能产生多少个交点,能把平面最多分成几部分,我们从最简单的情形入手,如图.列表如下:(1)当直线条数为5时,最多有________个交点,可写成和的形式为________;把平面最多分成______部分,可写成和的形式为________.(2)当直线条数为10时,最多有________个交点,把平面最多分成________部分. (3)当直线条数为n 时,最多有多少个交点?把平面最多分成多少部分? 【答案】(1)10;1+2+3+4;16;1+1+2+3+4+5 (2)45;56;(3)(1)2n n -;n(n 1)12+⎡⎤+⎢⎥⎣⎦ 【解析】【分析】(1)两条直线只有一个交点,第3条直线和前两条直线都相交,增加了2个交点,得1+2, 第4条直线和前3条直线都相交,增加了3个交点,得1+2+3, 第5条直线和前4条直线都相交,增加了4个交点,得1+2+3+4, 可得,n 条直线两两相交,最多有(1)2n n -个交点(n 为正整数,且n≥2). 一条直线把平面分成2部分,两条直线把平面分成2+2=4部分,三条直线把平面分成2+2+3=7部分,四条直线把平面分成2+2+3+4=11部分,五条直线把平面分成2+2+3+4+5=16部分,即n 条直线把平面分成2+2+3+4+5+…=1+1+2+3+…+n=1+(+1)2n n 部分 (2)代入(1)中的规律可得结果; (3)由(1)可得结论.【详解】解:(1)两条直线只有一个交点,第3条直线和前两条直线都相交,增加了2个交点,得1+2,第4条直线和前3条直线都相交,增加了3个交点,得1+2+3=4(41)2⨯-=6, 第5条直线和前4条直线都相交,增加了4个交点,得1+2+3+45(51)=2⨯-=10,∴可得,n 条直线两两相交,最多有(1)2n n -个交点(n 为正整数,且n≥2). 一条直线把平面分成2部分, 两条直线把平面分成2+2=4部分,三条直线把平面分成2+2+3=7部分, 四条直线把平面分成2+2+3+4=11部分, 五条直线把平面分成2+2+3+4+5=16部分,∴n 条直线把平面分成2+2+3+4+5+…=1+1+2+3+…+n=[1+(+1)2n n ]部分 (2)当n=10时,最多有10(101)=452⨯-个交点,把平面最多分成1+10(10+1)=562⨯部分. (3)当直线条数为n 时, 最多有1+2+3+…+(n -1)=(1)2n n -个交点; 把平面最多分成1+1+2+3+…+n =(1)12n n +⎡⎤+⎢⎥⎣⎦部分. 【点睛】本题考查的是多条直线相交的交点问题,解答此题的关键是找出规律,即n 条直线相交有(1)2n n -个交点.本题体现了由“特殊到一般再到特殊”的思维过程,有利于培养同学们的探究意识.五、关于角的个数的计数问题7. 有公共端点的两条射线组成的图形叫做角,这个公共端点叫做角的顶点,如图,如果过角的顶点A ,(1)在角的内部作一条射线,那么图中一共有几个角? (2)在角的内部作两条射线,那么图中一共有几个角? (3)在角的内部作三条射线,那么图中一共有几个角? (4)在角的内部作n 条射线,那么图中一共有几个角?【答案】(1)3;(2)6;(3)10;(4)(1)(2)2n n ++【解析】【分析】(1)根据图形判断即可;(2)根据图形可判断出在(1)的基础上再增加一条射线,则增加3个角,进行计算即可;(3)根据图形判断在(2)的基础上再增加一条射线,则增加4个角,进行计算即可;(4)根据前面结论进行总结即可.【详解】解:(1)如题图①,已知∠BAC ,如果在其内部作一条射线,显然这条射线就会和∠BAC 的两条边都组成一个角,这样一共就有1+2=3(个)角; (2)题图①中有1+2=3(个)角,如果再在题图①的角的内部增加一条射线,即为题图②,显然这条射线就会和图中的三条射线再组成三个角,则题图②中一共有1+2+3=6(个)角;(3)如题图③,在角的内部作三条射线,即在题图②中再增加一条射线,同样这条射线就会和图中的四条射线再组成四个角,即题图③中一共有1+2+3+4=10(个)角;(4)由(1)、(2)、(3)可知:在角的内部作一条射线,一共有1+2=3(个)角, 在角的内部作两条射线,一共有1+2+3=6(个)角, 在角的内部作三条射线,一共有1+2+3+4=10(个)角,所以如果在一个角的内部作n 条射线,则图中一共有1+2+3+…+n +(n +1)=(1)(2)2n n ++ (个)角.【点睛】本题考查了角的计数,通过观察,正确归纳总结出规律是解题关键.。

ACM校赛比赛题目及分析

ACM校赛比赛题目及分析

Problem A -- 超级难题Time Limit:1000ms Memory Limit:65535KBDescriptionACM程序设计大赛是大学级别最高的脑力竞赛,素来被冠以"程序设计的奥林匹克"的尊称。

大赛自1970年开始至今已有30年历史,是世界范围内历史最悠久、规模最大的程序设计竞赛。

比赛形式是:经过校级和地区级选拔的参赛组,于指定的时间、地点参加世界级的决赛,由3个成员组成的小组应用一台计算机解决6到8个生活中的实际问题。

参赛队员必须在5小时内编完程序并进行测试和调试。

此种大赛对参赛学生的逻辑分析能力、策略制定和脑力方面具有极大的挑战性。

大赛提倡在压力较大的情况下,培养学生的创造力、团队合作精神以解决竞赛的问题,从而挑选和发掘世界上最优秀的程序设计人才竞赛的历史可以上溯到1970年,当时在美国德克萨斯A&M大学举办了首届比赛。

当时的主办方是the Alpha Chapter of the UPE Computer Science Honor Society。

作为一种全新的发现和培养计算机科学顶尖学生的方式,竞赛很快得到美国和加拿大各大学的积极响应。

1977年,在ACM计算机科学会议期间举办了首次总决赛,并演变成为目前的一年一届的多国参与的国际性比赛。

迄今已经举办了29届ACM/ICPC以团队的形式代表各学校参赛,每队由3名队员组成。

每位队员必须是入校5年内的在校学生。

比赛期间,每队使用1台电脑需要在5个小时内使用C、C++、Pascal或Java中的一种编写程序解决8或10个问题。

程序完成之后提交裁判运行,并把运行结果及时通知参赛队。

而且有趣的是每队在正确完成一题后,组织者将在其位置上升起一只代表该题颜色的气球2009年的时候队伍A参加了ACM的区域赛,那次区域赛比赛总共有N个题,队伍A做了N个题中的M个。

队伍A 做第一题所用的时间为T1分钟,做第一题所用的时间为T2分钟,.......做第M题所用的时间为Tm分钟。

ACM题库完整版

ACM题库完整版

#include<stdio.h> int type(int); char week[7][10]={"saturday","sunday","monday","tuesday","wednesday","thursday","friday"}; int year[2]={365,366}; int month[2][12]={31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31}; int main(void) { int days,dayofweek; int i=0,j=0; while(scanf("%d",&days)&&days!=-1) { dayofweek=days%7; for(i=2000;days>=year[type(i)];i++) days-=year[type(i)]; for(j=0;days>=month[type(i)][j];j++) days-=month[type(i)][j]; printf("%d-%02d-%02d%s\n",i,j+1,days+1,week[dayofweek]); } return 0; } int type(int m) { if(m%4!=0||(m%100==0&&m%400!=0)) return 0; else return 1; }
构造新的模运算
1.题目描述 给定整数a,b,n,要求计算(a^b)mod n 2.输入 多组数据;=a<=40,0<=b<=3,1<=n<=500 3.输出 每组数据输出一行,为所求值 4.样例输入 #include<stdio.h> 235 224 #include<math.h> 5.样例输出 int main() 3 { 0
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算两点间的距离
Problem Description
输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离。

Input
输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开。

Output
对于每组输入数据,输出一行,结果保留两位小数。

Sample Input 0 0 0 1
0 1 1 0
Sample Output 1.00
1.41
程序:
#include"stdio.h"
#include"math.h"
#define Max 100
double distance(float x1,float y1,float x2,float y2);
void main()
{
float x1[Max],y1[Max],x2[Max],y2[Max];
double dist[Max];
int n=0,m=0;
printf("输入你要输入的数据组数n=");
scanf("%d",&n);
printf("Input:\n");
for(m=0;m<n;m++)
{
scanf("%f %f %f %f",&x1[m],&y1[m],&x2[m],&y2[m]);
dist[m]=distance(x1[m],y1[m],x2[m],y2[m]);
}
printf("Output:\n");
for(m=0;m<n;m++)
printf("%.2f\n",dist[m]);
}
//函数distance用来求两点间的距离
double distance(float x1,float y1,float x2,float y2)
{
float tempx=0,tempy=0;
double dist;
if(x2>x1)tempx=x2-x1;
else tempx=x1-x2;
if(y2>y1)tempy=y2-y1;
else tempy=y1-y2;
dist=sqrt(pow(tempx,2)+pow(tempy,2));
return dist;
}。

相关文档
最新文档