• 7-14 垃圾箱分布


    这题写了老半天,发现写的有问题,但是没找到问题在哪,我又重写了。

    对每个垃圾箱跑堆优化的dijkstra,但是最后测样例的时候发现精度不对,交上去却是对的,这题有点坑。

    #include <bits/stdc++.h>
    using namespace std;
    
    const int INF=0x3f3f3f3f;
    const int maxn=1e3+50;
    vector<pair<int,int> > g[maxn];
    int vis[maxn];
    int d[maxn];
    int n,m,k,ds,tmp;
    
    struct Node {
        int id;
        double sum;
        int dis;
        Node(int i,double s,int d):id(i),sum(s),dis(d) {}
    };
    vector<Node> ans;
    
    
    bool cmp(Node& a,Node& b) {
        if (a.dis!=b.dis) {
            return a.dis>b.dis;
        }
        else if (a.sum!=b.sum) {
            return a.sum<b.sum;
        }
        return a.id<b.id;
    }
    
    struct Dode {
        int id;
        int dis;
        Dode(int i,int d):id(i),dis(d){}
        bool operator < (const Dode& a) const {
            return dis>a.dis;
        }
    };
    
    void dijkstra(int s) {
        memset(vis,0,sizeof(vis));
        memset(d,INF,sizeof(d));
        d[s]=0;
        priority_queue<Dode> pq;
        pq.push(Dode(s,0));
        while (!pq.empty()) {
            Dode f=pq.top();
            pq.pop();
            if (vis[f.id]) {
                continue;
            }
            vis[f.id]=1;
    //        printf("%d
    ",f.id);
            for (auto p:g[f.id]) {
                int next=p.first;
                int cost=p.second;
    //            printf("%d %d
    ",next,cost);
                if (!vis[next]&&f.dis+cost<d[next]) {
                    d[next]=f.dis+cost;
                    pq.push(Dode(next,d[next]));
                }
            }
        }
    }
    
    int judge(int s) {
    //    printf("s:  %d
    ",s);
        double sum=0;
        int minlen=INF;
        for (int i=1;i<=n;i++) {
            if (d[i]>ds) {
                return 0;
            }
    //        printf("%d  ",d[i]);
            sum+=d[i];
            minlen=min(d[i],minlen);
        }
    //    printf("
    ");
        ans.push_back(Node(s-1000,sum,minlen));
        return 1;
    }
    
    int main()
    {
        scanf("%d%d%d%d",&n,&m,&k,&ds);
        char p1[100],p2[100];
        while (k--) {
            scanf("%s",p1);
            scanf("%s",p2);
            scanf("%d",&tmp);
            int s=0,e=0;
            if (p1[0]=='G') {
                s=1000+atoi(p1+1);
            }
            else {
                s=atoi(p1);
            }
    
            if (p2[0]=='G') {
                e=1000+atoi(p2+1);
            }
            else {
                e=atoi(p2);
            }
            g[s].push_back(make_pair(e,tmp));
            g[e].push_back(make_pair(s,tmp));
        }
        int cnt=0;
        for (int i=1001;i<=1000+m;i++) {
            dijkstra(i);
            cnt+=judge(i);
        }
        if (!cnt) {
            printf("No Solution
    ");
            return 0;
        }
        sort(ans.begin(),ans.end(),cmp);
        printf("G%d
    ",ans[0].id);
        printf("%.1f %.1f
    ",(double)ans[0].dis,ans[0].sum/(double)n);
        return 0;
    }
    
    
  • 相关阅读:
    http 400 错误的请求怎么解决
    HTTP 404
    怎样在WIN7系统下安装IIS
    未能找到类型或命名空间名称“XXXX”(是否缺少 using 指令或程序集引用?) 转
    错误 1 未能找到元数据文件“C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files/wwwroot/7cb4fcd
    mklink命令转移win7系统盘文件夹users和programdata(附xp的方法)
    前端进阶之路:初涉Less
    原生js实现tooltip提示框的效果
    jquery+css实现邮箱自动补全
    前端面试中常见的算法问题读后整理
  • 原文地址:https://www.cnblogs.com/xyqxyq/p/12312437.html
Copyright © 2020-2023  润新知