zoukankan      html  css  js  c++  java
  • Arctic Network poj 2349

    http://poj.org/problem?id=2349  

    题意:现有 m 个地点, n 个卫星。  卫星有一个神奇的作用, 作用在于只要某个地方安装有卫星, 不论他们之间距离为多远, 都能够互相接收到彼此间信 号, (这么好的东西当然不会让每个地方都有的), 那么其他地方需要通过收发器 D 来连接。让你求1 - m 个地方在共安装过 n 个卫星后,我们所需要     的 收发器 D 所需的最大距离是多少?

     

    *****一开始提交错误仍然是因为%lf和%f,吸取吸取教训。。。

    *******问:有人告诉我不能在printf中使用%lf。为什么printf()用%f输出double型,而scanf却用%lf呢?

         答:printf的%f说明符的确既可以输出float型又可以输出double型。根据“默认参数提升”规则(在printf这样的函数的可变参数列表中,不论作用域内有没有原型,都适用这一规则)float型会被提升为double型。因此printf()只会看到双精度数。
    
    (严格地讲,%lf在printf下是未定义的,但是很多系统可能会接受它。要确保可移植性,就要坚持使用%f。)
    
    对于scanf,情况就完全不同了,它接受指针,这里没有类似的类型提升。(通过指针)向float存储和向double存储大不一样,因此,scanf区别%f和%lf。


    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<queue>
    #include<algorithm>
    using namespace std;
    
    #define maxn 1510
    #define oo 0x3f3f3f3f
    double maps[maxn][maxn], dist[maxn], p[maxn];
    int  v[maxn];
    int n, m;
    
    struct node
    {
        int x, y;
    }s[maxn];
    
    void Init()
    {
        int i, j;
    
        for(i=1; i<=m; i++)
        {
            for(j=1; j<=m; j++)
            {
                if(i==j) maps[i][j]=0;
                else maps[i][j] = maps[j][i] =oo;
            }
        }
    }
    
    void Dij()
    {
    
        memset(v, 0, sizeof(v));
        for(int i=1; i<=m; i++)
            dist[i] = maps[1][i];
            v[1] = 1;
    
        for(int i=1; i<m; i++)
        {
            int index=-1;
             p[i] = 1000000.0;
            for(int j=1; j<=m; j++)
            {
                if(!v[j] && dist[j]<p[i])
                {
                    index = j;
                    p[i] = dist[j];
                }
            }
    
            v[index] = 1;
    
            for(int j=1; j<=m; j++)
            {
                if(!v[j] && dist[j]>maps[index][j])
                    dist[j] = maps[index][j];
            }
        }
    
    }
    int main()
    {
        int T;
        scanf("%d", &T);
    
        while( T --)
        {
            scanf("%d %d", &n, &m);
    
            Init();
    
            for(int i=1; i<=m; i++)
                scanf("%d %d", &s[i].x, &s[i].y);
    
            for(int i=1; i<m; i++)
            {
                for(int j=i+1; j<=m; j++)
                {
                    double l = sqrt((s[i].x-s[j].x)*(s[i].x-s[j].x)+(s[i].y-s[j].y)*(s[i].y-s[j].y));
                    maps[i][j] = maps[j][i] = min(maps[i][j], l);
                }
            }
    
            Dij();
    
            sort(p+1, p+m);
    
            printf("%.2f
    ", p[m-n]);
        }
        return 0;
    }
    View Code
    
    
    

  • 相关阅读:
    Atcoder Grand Contest 038 F
    洛谷 P5502
    Codeforces 1010F
    洛谷 P4621
    洛谷 P5518
    Oracle-切换当用用户的模式
    Oracle-DBV数据文件校验工具
    【转载】Oracle-通过增量备份前滚的反手解决物理备库归档缺失,损坏,gap问题
    Oracle-对比SAA与STA
    Oracle-SAA
  • 原文地址:https://www.cnblogs.com/daydayupacm/p/5695874.html
Copyright © 2011-2022 走看看