3 條題解

  • 2
    @ 2023-10-4 8:33:10

    声明:本题洛谷有原题,想C的去C题解。怕你们说题解代码和我一样

    课外知识:勾股定理 d2=(x1x2)2+(y1y2)2d^2=(x_1-x_2)^2+(y_1-y_2)^2

    这道题首先要明确所有导弹不是被11号系统拦截就是被22号系统拦截

    我们看到这道题的数据范围是101055次方,大概是nlognnlog_n复杂度,联想到sortsort排序

    让我们思考一下最优解,在最优解中11号系统肯定先拦下距离自己近的

    如果11号去拦距离它远的导弹的话,其实就捎带脚的把近的导弹拦截了

    如果我们把所有导弹按照对11号的距离进行升序排序,通过刚才的思考我们知道肯定是11号拦截一个前缀,剩下的后缀交给22

    那么我们枚举一下这个前缀和后缀的分界点即可(分界点我们此处定义为前缀的最后一个点)

    前缀处理的11号系统代价比较好算,就是分界点到11号系统的距离

    22号系统此时就不能再排序看后缀谁是最大的来计算代价,此时需要我们预处理出来一个数组,让di=d_i= 包括第i以及它后面的导弹中最远距离

    • 1
      @ 2025-12-14 8:49:57
      #include<bits/stdc++.h>
      #define xh(a,b,c) for(int a=b;a<=c;a++)
      #define int long long
      using namespace std;
      int x1,x2,Y1,Y2;
      int n;
      struct node{
      	int a,b;
      }a[100010];
      int ans;
      int maxn1,maxn2;
      bool cmp(node x,node y){
      	return x.a+x.b>y.a+y.b;
      }
      signed main(){
      	cin>>x1>>Y1>>x2>>Y2;
      	cin>>n;
      	xh(i,1,n){
      		int x,y;
      		cin>>x>>y;
      		a[i].a=(abs(x1-x)*abs(x1-x)+abs(Y1-y)*abs(Y1-y));
      		a[i].b=(abs(x2-x)*abs(x2-x)+abs(Y2-y)*abs(Y2-y));
      	}
      	sort(a+1,a+n+1,cmp);
      	xh(i,1,n){
      		if(a[i].a<=maxn1||a[i].b<=maxn2)continue;
      		if(a[i].a+maxn2>a[i].b+maxn1)maxn2=a[i].b;
      		else maxn1=a[i].a;
      	}
      	cout<<maxn1+maxn2;
      	return 0;
      }
      
      • 1
        @ 2025-7-4 14:07:43

        预处理枚举情况的导弹拦截系统工作半径 对答案取最小值即可

        #include<bits/stdc++.h>
        using namespace std;
        int nx,ny,mx,my;
        int n;
        struct node{
        	int x,y,dx,dy;
        }a[100005];
        int dx[100005],dy[100005];
        bool cmp(node i,node j){
        	return i.dx<j.dx;
        }
        int ans=1e9;
        int jl(int aa,int b,int c,int d){
        	return (aa-c)*(aa-c)+(b-d)*(b-d);
        }
        signed main(){
        	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
        	cin>>nx>>ny>>mx>>my;
        	cin>>n;
        	for(int i=1;i<=n;i++){
        		cin>>a[i].x>>a[i].y;
        		a[i].dx=jl(a[i].x,a[i].y,nx,ny);
        		a[i].dy=jl(a[i].x,a[i].y,mx,my);
        //提前算出代价
        	}
        	sort(a+1,a+n+1,cmp);
        	for(int i=1;i<=n;i++){
        		dx[i]=max(dx[i-1],a[i].dx);
        	}
        	for(int i=n;i>=1;i--){
        		dy[i]=max(dy[i+1],a[i].dy);
        	}//根据题意预处理
        	for(int i=0;i<=n;i++){
        //注意要从 0 开始,因为导弹拦截系统可以不拦截导弹
        		ans=min(ans,dx[i]+dy[i+1]);
        	}
        	cout<<ans;
        	return 0;
        }
        
        • 1

        資訊

        ID
        226
        時間
        1000ms
        記憶體
        256MiB
        難度
        5
        标签
        (無)
        遞交數
        357
        已通過
        128
        上傳者