• 3315 时空跳跃者的魔法(一个超级恶心的题目)


    3315 时空跳跃者的魔法

     

     时间限制: 1 s
     空间限制: 32000 KB
     题目等级 : 白银 Silver 
     
    题目描述 Description

    背景:suntian正准备将飞翔带回圣殿,不料一声巨响,suntian的三维时空被飞翔炸开,飞翔再次出现在suntian面前,两人同时出手……随着两人昏天暗地的打斗,时空开始扭曲并产生波动,影响了suntian施咒,然而就是这一下,飞翔抓住了时机,释放巨大的能量将suntian送入了一个扭曲的四维时空……

    描述:为了快一点追到飞翔,suntian希望在最短的时间内逃出这个四维时空。

    他马上集中精力,在0.0000000000000001ms之内找到了这个时空的奇点。令他吃惊的是,这个空间竟然有n个奇点!这让suntian摸不着头脑。但作为圣殿战士,suntian也不是吃素的,他在冥思苦想之后得出了一个结论:只有在某个奇点处用咒术将其他n-1个奇点拉到这个奇点,才能将奇点打开。但是,将奇点拉拽到另一个奇点耗费的能量不同。能量W为:trunc(sqrt((x1-x2)^2+(y1-y2)^2+(z1-z2)^2))+abs(t1-t2) Tas。奇点拉在一起将被合并,suntian可以先把某些奇点合并再拉到他所处的奇点。为了抓捕到飞翔,suntian想用最少的能量来打开奇点,但是suntian能量已经所剩不多了。那么,suntian能否逃脱呢?

    输入描述 Input Description

    第一行,为n(0<n<=10^3,n∈N)。

    第2至n+1行,为每行的坐标x,y,z,t(0<x,y,z,t<=10^4,x,y,z,t∈N)。 第n+2行,为suntian剩余能量L(0<L<maxlongint,L∈N)。

    输出描述 Output Description

    共一行。

     如果所用最少能量tot>L,那么输出“Death”;

     否则,输出tot。(tot<maxlongint)

    样例输入 Sample Input

    5

    1 1 1 1

    1 1 1 2

    2 2 2 2

    3 3 3 3

    3 3 3 4

    5Tas

    样例输出 Sample Output

    5Tas

    数据范围及提示 Data Size & Hint

    数据提示上面有。

    分类标签 Tags 

     
    最小生成树 图论
     
    就是个最小生成树,
    只不过……
    这个题预处理好恶心!!!!
    超级恶心!!!!
    做哭了/(ㄒoㄒ)/~~
     
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    int n,x[1002],y[1002],z[1002],t[1002],m=0,num,fa[1000+2],sum;
    struct edge{int x,y;double v;}e[1000002];
    int cmp(edge a,edge b){return a.v<b.v;}
    int find(int x)
    {
        if(x==fa[x])
            return x;
        return fa[x]=find(fa[x]);
    }
    double ans;
    long long l;
    char s[1002];
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d%d%d%d",&x[i],&y[i],&z[i],&t[i]);
        for(int i=1;i<=n;i++)fa[i]=i;
        for(int i=1;i<=n;i++)
            for(int j=1;j<i;j++)
            {
                m++;
                e[m].x=i;
                e[m].y=j;
                e[m].v=sqrt((float)(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])+(z[i]-z[j])*(z[i]-z[j]))+abs(t[i]-t[j]);
                m++;
                e[m].x=j;
                e[m].y=i;
                e[m].v=e[m-1].v;
            }
        sort(e+1,e+m+1,cmp);
        num=n-1,sum=1;
        while(num)
        {
            int xx=find(e[sum].x),yy=find(e[sum].y);
            if(xx!=yy)
            {
                fa[xx]=yy;
                ans+=e[sum].v;
                ans=floor(ans);
                num--;
            }
            sum++;
        }
        cin>>s;
        for(int i=0;s[i]!='T';i++)
        {
            l*=10;
            l+=s[i]-'0';
        }
        if(l>=ans)cout<<ans<<"Tas"<<endl;
        else cout<<"Death"<<endl;
        return 0;
    }
    代码
  • 相关阅读:
    B
    A
    P1057 传球游戏
    P1702 突击考试
    P1394 山上的国度
    P2117 小Z的矩阵
    P1510 精卫填海
    P1294 高手去散步
    P1071 潜伏者
    保留
  • 原文地址:https://www.cnblogs.com/EvilEC/p/6047605.html
Copyright © 2020-2023  润新知