| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3046 人关注过本帖
标题:NOIP2010:导弹拦截
只看楼主 加入收藏
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
结帖率:79.37%
收藏
已结贴  问题点数:50 回复次数:13 
NOIP2010:导弹拦截
题目描述
经过11 年的韬光养晦,某国研发出了一种新的导弹拦截系统,凡是与它的距离不超过其工作半径的导弹都能够被它成功拦截。当工作半径为0 时,则能够拦截与它位置恰好相同的导弹。但该导弹拦截系统也存在这样的缺陷:每套系统每天只能设定一次工作半径。而当天的使用代价,就是所有系统工作半径的平方和。
某天,雷达捕捉到敌国的导弹来袭。由于该系统尚处于试验阶段,所以只有两套系统投入工作。如果现在的要求是拦截所有的导弹,请计算这一天的最小使用代价。

【提示】
两个点(x1, y1)、(x2, y2)之间距离的平方是(x1−;;; x2)^2+(y1−;;;y2)^2。
两套系统工作半径r1、r2 的平方和,是指r1、r2 分别取平方后再求和,即r1^2+r2^2。

【样例 1 说明】
样例1 中要拦截所有导弹,在满足最小使用代价的前提下,两套系统工作半径的平方分
别为18 和0。
【样例2 说明】
样例中的导弹拦截系统和导弹所在的位置如下图所示。要拦截所有导弹,在满足最小使用代价的前提下,两套系统工作半径的平方分别为20 和10。
图片附件: 游客没有浏览图片的权限,请 登录注册



【数据范围】
对于10%的数据,N = 1
对于20%的数据,1 ≤ N ≤ 2
对于40%的数据,1 ≤ N ≤ 100
对于70%的数据,1 ≤ N ≤ 1000
对于100%的数据,1 ≤ N ≤ 100000,且所有坐标分量的绝对值都不超过1000。

输入格式
第一行包含4 个整数x1、y1、x2、y2,每两个整数之间用一个空格隔开,表示这两套导
弹拦截系统的坐标分别为(x1, y1)、(x2, y2)。
第二行包含1 个整数N,表示有N 颗导弹。接下来N 行,每行两个整数x、y,中间用
一个空格隔开,表示一颗导弹的坐标(x, y)。不同导弹的坐标可能相同。

输出格式
输出只有一行,包含一个整数,即当天的最小使用代价。

样例输入
【输入输出样例1】
0 0 10 0
2
-3 3
10 0

【输入输出样例2】
0 0 6 0
5
-4 -2
-2 3
4 0
6 -2
9 1
样例输出
【输入输出样例1】
18

【输入输出样例2】
30

不知各位高手对这题有什么见解?

[ 本帖最后由 sunyh1999 于 2010-11-28 20:14 编辑 ]
搜索更多相关主题的帖子: 导弹 
2010-11-28 12:31
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:13 
我看看题目先!

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-11-28 17:15
shafeilong
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:236
专家分:1434
注 册:2009-3-21
收藏
得分:13 
呵呵  我不是来回答问题的  只想把自己的思路写下来
PeoPle[n];
for(time=1;timt<MAXTIME;time++)
{
    for(j=0;j<n;j++)
    {
        PeoPle[j]-=1;
        if(PeoPle[j]==0)
        {
            PeoPle[j]=下一个同学的需水量;
            if(有m个人(满人了)且PeoPle[]都为0)
                输出time 结束程序。。
        }
    }
}

不知道是不是这种算法 ....求指教
2010-11-28 20:09
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
无语了,没想到放到评测系统上一测,竟然AC了,还是最优解~~~~~~~~~~~

原来测试数据中有一个数据是很奇怪的符号,所以拖在那里.....

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-11-28 20:11
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
现在改一下题目~~

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-11-28 20:13
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-11-28 20:17
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:0 
..............

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-11-28 20:34
xiaomarn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:348
专家分:2026
注 册:2009-3-18
收藏
得分:13 
程序代码:
#include<stdio.h>
#include<malloc.h>

typedef struct
{
      int x;
      int y;
      int distx;
      int disty;
}point,*ppoint;

void sort(ppoint,int);
int maxy(ppoint,int,int);

int
main(void)
{
      int n,x1,y1,x2,y2;
      int* p1,*p2;
      ppoint pp;
      int i;
      unsigned int min=-1,temp=1,max;

      printf("input:\n");
      scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
      scanf("%d",&n);
      pp=(ppoint)malloc(n*sizeof(point));
      for(i=0;i<n;i++)
            scanf("%d %d",&((pp+i)->x),&((pp+i)->y));
      /*p1=(int*)malloc(n*sizeof(int));
      p2=(int*)malloc(n*sizeof(int));  */
      for(i=0;i<n;i++)
      {
            (pp+i)->distx=((pp+i)->x-x1)*((pp+i)->x-x1)+((pp+i)->y-y1)*((pp+i)->y-y1);
            (pp+i)->disty=((pp+i)->x-x2)*((pp+i)->x-x2)+((pp+i)->y-y2)*((pp+i)->y-y2);
      }

      /*for(i=0;i<n;i++)
            printf("%d ",*(p1+i));
      for(i=0;i<n;i++)
            printf("%d ",*(p2+i)); */

      /*for(i=0;i<n;i++)
            printf("%d %d %d %d\n",(pp+i)->x,(pp+i)->y,(pp+i)->distx,(pp+i)->disty);
      dist=(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);  */
      sort(pp,n);

     /* for(i=0;i<n;i++)
            printf("%d %d %d %d\n",(pp+i)->x,(pp+i)->y,(pp+i)->distx,(pp+i)->disty);
      for(i=0;i<n;i++)
            printf("%d ",*(p1+i));
      for(i=0;i<n;i++)
            printf("%d ",*(p2+i));  */
      for(i=0;i<n;i++)
      {
            max=maxy(pp,i+1,n);
            temp=max+(pp+i)->distx;
            if(temp<min)
                  min=temp;
      }
           

      printf("\n%d",min);
      /*printf("result:%d %d %d %d\n",x1,y1,x2,y2);
      printf("n=%d\n",n);
      for(i=0;i<n;i++)
            printf("%d %d\n",(pp+i)->x,(pp+i)->y); */
      getch();
      return 0;
}

void sort(ppoint p,int size)
{
      int i,j;
      point pt;

      for(i=0;i<size-1;i++)
            for(j=i+1;j<size;j++)
            {
                  if((p+j)->distx<(p+i)->distx)
                  {
                        pt= *(p+j);
                        *(p+j)= *(p+i);
                        *(p+i)= pt;
                  }
            }
}

int
maxy(ppoint p,int pos,int size)
{
      int i,max;

      max=(p+pos)->disty;
      for(i=pos+1;i<size;i++)
            if(max<(p+i)->disty)
                  max=(p+i)->disty;
      return max;
}
程序写完才发现自己水平好烂。
很多地方都可以改进的,草草了事交了差,对不住了楼主
写到一半时曾想放弃的,但坚持了下来,结果写成这样。。。


[ 本帖最后由 xiaomarn 于 2010-11-28 22:11 编辑 ]
2010-11-28 22:08
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
你这个样例过了吗?  还有10W个数据用冒泡,好像慢了点

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-11-29 08:58
zghnxzdcx
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:4
帖 子:550
专家分:1176
注 册:2010-4-6
收藏
得分:13 
不要过分的迷信评测系统,那样的系统也是人开发的

你永远不可能战胜一个纯傻子,因为他会把你的智商拉到和他同一个水平,然后用他的丰富经验打败你。
2010-11-29 09:03
快速回复:NOIP2010:导弹拦截
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030101 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved