PAT-L2-007-gplt真题

Cwolf9 2018-03-26 原文

PAT-L2-007-gplt真题

题目分析:

1. 首先,题目说一个家庭有孩子爸爸妈妈等几辈人,可以利用并查集将一个家庭里的所有人变成一个集合;

2. 刚好题目的目的也是这样,输出的是一个家庭人数,人均房产面积,人均房产套数等;

3. 然后每个家庭保留最小的id,这步在并查集Union时可以实现;

4. 并查集合并后,每个家庭只有一个id,就是最小的那个id;

5. 然后将新的集合处理一下输出就好了;

链接:https://www.patest.cn/contests/gplt/L2-007

(怎么添加链接??)

(csdn和博客园要是能同步就好了)(逃

AC代码如下:

#include<bits/stdc++.h>  
#define test printf("***\n")  
#define iis std::ios::sync_with_stdio(false)  
using namespace std;  
typedef long long LL;  
const int N = 11000;  
const int M = 1000005;  
const int INF = 0x3f3f3f3f;  
const LL mod = 1000000007;  
const double eps=1e-8;  
struct lp{  
    double ans1,ans2;//ans1是房产套数,ans2是房产面积  
    int id,num;  
    lp(){ans1=ans2=num=id=0;}  
    friend bool operator <(const lp &A,const lp &B){  
        if(A.ans2!=B.ans2)return A.ans2>B.ans2;  
        return A.id<B.id;  
    }  
}a[N],b[N],mul[N];//a是初始,mul是并查集处理后的,b是答案  
int vis[N],m[N],fa[N];//m数组记录的是家庭id,和vis一个作用  
int n;  
void init(){//初始化  
    for(int i=0;i<N;++i)fa[i]=i;  
    memset(vis,0,sizeof(vis));  
    memset(m,0,sizeof(m));  
}  
int Fi(int x){  
    return fa[x]==x?x:fa[x]=Fi(fa[x]);  
}  
void un(int a,int b){//union这里的小细节,是每个家庭只保留最小id  
    int x=Fi(a),y=Fi(b);  
    if(x==y)return;  
    if(x>y)fa[x]=y;  
    else fa[y]=x;  
}  
int main(){  
    scanf("%d",&n);  
    init();  
    for(int i=0;i<n;++i){  
        int p1,p2,d,k;  
        scanf("%d%d%d",&a[i].id,&p1,&p2);  
        vis[a[i].id]=1;  
        if(p1!=-1){  
            un(p1,a[i].id);  
            vis[p1]=1;  
        }  
        if(p2!=-1){  
            un(p2,a[i].id);  
            vis[p2]=1;  
        }  
        scanf("%d",&k);  
        while(k--){  
            scanf("%d",&d);  
            if(d!=-1){  
                un(a[i].id,d);  
                vis[d]=1;  
            }  
        }  
        double aa,bb;  
        scanf("%lf %lf",&aa,&bb);  
        a[i].ans1=aa;a[i].ans2=bb;  
    }  
    for(int i=0;i<n;++i){//合并家庭  
        int id=Fi(a[i].id);  
        mul[id].id=id;  
        mul[id].ans1+=a[i].ans1;  
        mul[id].ans2+=a[i].ans2;  
    }  
    for(int i=0;i<10000;++i){  
        if(vis[i]){  
            mul[Fi(i)].num++;  
        }  
    }  
    int k=0;  
    for(int i=0;i<10000;++i){  
        if(vis[i]){  
            int id=Fi(i);  
            if(!m[id]){  
                m[id]=1;  
                double x=mul[id].ans2/mul[id].num;  
                b[k].ans2=x;  
                b[k].id=id;  
                x=mul[id].ans1/mul[id].num;  
                b[k].num=mul[id].num;  
                b[k++].ans1=x;  
            }  
        }  
    }  
    sort(b,b+k);  
    printf("%d\n",k);//这里要输出家庭总数  
    for(int i=0;i<k;++i){  
        printf("%04d %d %.3f %.3f\n",b[i].id,b[i].num,b[i].ans1,b[i].ans2);  
    }  
    return 0;  
}  

View Code

 

posted on 2018-03-26 13:23 日常膜大佬~太强了 阅读() 评论() 编辑 收藏

 

 
版权声明:本文为Cwolf9原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Cwolf9/p/8650306.html

PAT-L2-007-gplt真题的更多相关文章

  1. C# GDI+编程之基础篇

    一、关于GDI+     从本质上来看,GDI+为开发者提供了一组实现与各种设备(例如监视器,打印机及其它具有 […]...

  2. C 简单实现LBS基站定位

    C 简单实现LBS基站定位 基站定位的原理很简单:就是访问Google服务器,告诉它我们的基站信息,服务器就会 […]...

  3. C# 正则表达式语法

    正则表达式通常包含字母文本(Literaltext)和元字符(metacharacter)  字母文本指的是普 […]...

  4. (一)C的编译,printf,规范化

    (一)C的编译,printf,规范化 (一)编译的具体过程: 以前一直觉得,C代码的具体实现过程就是把几个.c […]...

  5. C# 反射 增、删、改、查方法

    C# 反射 增、删、改、查方法 /// <summary> /// 反射查询方法 /// < […]...

  6. 使用 WeihanLi.Npoi 操作 CSV

    使用 WeihanLi.Npoi 操作 CSV Intro 最近发现 csv 文件在很多情况下都在使用,而且经 […]...

  7. 用二分法求下面方程在(-10,10)之间的根。【谭浩强第四版课后习题】

    用二分法求下面方程在(-10,10)之间的根:2x3-4x2+3x-6=0 编程思路:仿照二分查找,将区间划分 […]...

  8. C#如何防止程序多次运行的技巧(精典)

    一、引言最近发现很多人在论坛中问到如何防止程序被多次运行的问题的,所以这里就记录下来,希望给遇到同样问题的朋友 […]...

随机推荐

  1. 简单翻译工具–必应词典第三方api使用方法

    之前做过一个桌面翻译工具,桌面每日一句–桌面翻译工具(有道翻译,微软翻译,Google翻译) 获取 […]...

  2. DNS_PROBE_FINISHED_NXDOMAIN

        DNS_PROBE_FINISHED_NXDOMAIN 用如下链接清除dns即可   chrome:/ […]...

  3. 通过代数,数字,欧几里得平面和分形讨论JavaScript中的函数式编程

    通过代数,数字,欧几里得平面和分形讨论JavaScript中的函数式编程 本文是对函数式编程范式的系列文章从而 […]...

  4. 玩转OneNET物联网平台之MQTT服务④ —— 远程控制LED(设备自注册)+ Android App控制

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力。希望大家分享给你周边需要的朋友或者同 […]...

  5. 【ZeyFraのJavaEE开发小知识02】MybatisPlus&ElementUI

    1、关于如何获得Mybatis-Plus在插入对应为自增长主键但并未对该主键赋值的实体类之后其主键值 对应数据 […]...

  6. EOS基础全家桶(一)开篇

    简介 从今天开始我会在FishoPark上与大家分享EOS的一些技术经验和基础,如果大家在看文章的过程中有任何 […]...

  7. python ast模块使用

    ast(Abstract Syntax Trees)是python中非常有用的一个模块,我们可以通过分析python的抽象语法树来对python的代码进行分析和修改。ast作用在python代码的语法被解析后,被编译成字节码之前。as...

  8. 快速开发平台的比较

    WebBuilder WebBuilder是一款开源的跨平台、数据库和浏览器的可视化Web应用开发平台。Web […]...

展开目录

目录导航