2018暑假集训Day1

这几天的训练对我来说真是前所未有的高强度。
然后,几乎都是垫底吧。(被列入危险名单
觉得今年的普及一等很悬,很悬。。

今天值得写写blog的T2;(其实对大部分人来说很水

一天狼需要从二维平面上的(0,0) (0,0)点回到(10000000,0) (10000000,0)点的巢,有n只兔子埋伏在n个位置(xi,yi) (xi,yi)
当兔子进入狼周围p的范围内时,兔子就会自爆使得狼被眩晕t秒,兔子的目标是使得狼受到尽可能多兔子的袭击。
已知狼和兔子运动速度相同,每秒移动一个单位,但这并不是指它们以秒为单位行动。p可以视为一个无限接近于0的正实数。另外狼和兔子的行动情况是相互可见的。
现在小A想知道,对于几种情况,假如兔子和狼都绝对聪明,狼会受到多少次兔子的袭击
输入格式
第一行两个非负整数 n,t 秒。
接下来n行每行两个整数 xi,yi
输出格式
一个正整数表示答案
样例输入
3 1
1 1
1 2
1000000000 0
样例输出
2
样例解释
第一只兔子可以走到(1,0)处等待狼,假如狼直接走就会恰好经过(1,0);假如不直接走那么第一只兔子可以始终保持在狼的右侧。
所以狼必定受到第一只兔子的袭击。狼受到第一只兔子袭击后眩晕1秒,这1秒时间可以让第二只兔子靠近狼并发动袭击。
但第三只兔子距离狼太远了,不可能在狼到达巢之前袭击到狼。

被样例解释绕晕了,看也看不懂,想着各种情况特判吧唧吧唧的。
然后事实证明又一次把问题想复杂。。(无经验的蒟蒻
我们其实只要比狼和兔子到达狼巢的最短时间就好了。
如果兔子可以比狼早到狼巢,就完全可以在半路袭击狼,为后面的兔子争取时间。
时间长短比较距离:两点之间,线段最短。平面上两点距离,没有人不会的吧~

#include<bits/stdc++.h>
using namespace std;
struct ele{int x,y;}e[500005];
int n,t;
long long now;//狼目前到老窝的最短时间(会更新)
int read(){
    int x=0,f=1; char c; c=getchar();
    while(c<'0'||c>'9') {if(c=='-')f=-1; c=getchar();}
    while(c>='0'||c<='9'){x=x*10+c-'0'; c=getchar();}
    return x*f;
}

long long D(ele k){return 1LL*(k.x-10000000)*(k.x-10000000)+1LL*k.y*k.y;}
//求距离(不开根号,平方直接比
bool cmp(ele k1,ele k2){return D(k1)<D(k2);}

int main(){
    n=read(); t=read();
    for(int i=1;i<=n;i++) e[i].x=read(),e[i].y=read();
    sort(e+1,e+1+n,cmp);//贪心:距离越短拦的几率越大
    now=0x3f3f3f3f;
    for(int i=1;i<=n;i++){
        if(1LL*now*now>=D(e[i])) now+=t;//更新在这里
        else {printf("%d",i-1); return 0;}
        //拦不住啦(后面的更拦不住)输出!
    }
    printf("%d\n",n);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/MiaoZ_/article/details/81461806