ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021-09-22 PAT甲级

2021-09-22 14:00:50  阅读:152  来源: 互联网

标签:PAT fa int 09 ++ 2021 ans ha id


  • 题目大意
    给定一个长度为n的序列,将他分成两个集合,要求:1. 集合元素个数相差最少 2. 集合元素和相差最大。输出:元素个数差和元素和之差。
  • 思路
    分奇偶性讨论一下。
  • Code
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;

int n,a[N];
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	sort(a+1,a+1+n);
	int s1=0,s2=0;
	for(int i=1;i<=n/2;i++) s1+=a[i];
	for(int i=n/2+1;i<=n;i++) s2+=a[i];
	if(n%2==0)
	{
		cout<<0<<' '<<s2-s1;
	}
	else
	{
		cout<<1<<' '<<s2-s1;
	}
	
	return 0;
}


1114 Family Property (25 分)

  • 题目大意
    给定一些家庭关系,让你输出有几个家庭,每个家庭的信息:1.家庭中最小编号id 2. 家庭中人数M 3. 家庭中财产平均数avg_aets 4.家庭中占用面积的平均数avg_area
    并要求:按平均占用面积由大到小,id由小到大的顺序输出。
  • 思路
    经典并查集,但是要有一个好的逻辑方便对输入输出进行处理
    第一个代码写了一会儿只有22分,但是不想调了;第二个代码是正解满分。
  • Code
#include<bits/stdc++.h>
using namespace std;
const int N = 10010;

int n,fa[N],st[N],id[N],M[N];
int a,b,c,k,d;
double sets[N],area[N],sum_sets[N],sum_area[N];
set<int> v;
struct node{
	int first;
	int second;
	int key;
}ans[N];
bool cmp(const struct node x,const struct node y)
{
	if(x.first>y.first) return true;
	else if(x.first==y.first&&x.second<y.second) return true;
	return false;
}
void init()
{
	for(int i=0;i<=9999;i++) fa[i]=i;
}

int find(int x)
{
	if(x==fa[x]) return x;
	return fa[x]=find(fa[x]);
}

void un(int x,int y)
{
	int fx=find(x);
	int fy=find(y);
	if(fx!=fy) fa[fx]=fy;
	return;	
}

int main()
{
	cin>>n;
	init();
	for(int i=0;i<=9999;i++) id[i]=999999;
	for(int i=1;i<=n;i++)
	{
		cin>>a>>b>>c;
		v.insert(a);
		if(b!=-1) 
		{
			un(a,b);	
			v.insert(b);
		}
		if(c!=-1)
		{
			un(a,c);	
			v.insert(c);
		} 
		cin>>k;
		while(k--)
		{
			cin>>d;
			un(a,d);
			v.insert(d);
		}
		cin>>sets[a]>>area[a];	
	}
	for(auto i:v) find(i);
	for(auto i:v) 
	{
		st[fa[i]]=1;
		id[fa[i]]=min(id[fa[i]], i);
		M[fa[i]]++;
		sum_sets[fa[i]]+=sets[i];
		sum_area[fa[i]]+=area[i];
	}
	int cnt=0;
	for(auto i:v)
	{
		if(st[i]) cnt++;
	}
	cout<<cnt<<endl;
	int idx=0;
	for(auto i:v)
		if(st[i])
		{
			ans[++idx].first=sum_area[i]/M[i];
			ans[idx].second=id[i];
			ans[idx].key=i;
		}
	sort(ans+1,ans+idx+1,cmp);
	for(int i=1;i<=idx;i++)
	{
		printf("%04d %d %.3lf %.3lf\n",ans[i].second, M[ans[i].key], sum_sets[ans[i].key]/M[ans[i].key], sum_area[ans[i].key]/M[ans[i].key]);
	}
	
	return 0;
}
#include<bits/stdc++.h>
using namespace std;
const int N = 10010;

int n;
int p[N], c[N], hc[N], ha[N];
bool st[N];

struct Edge
{
    int a, b;
}e[N];

struct Family
{
    int id, c, hc, ha;

    bool operator< (const Family &t) const
    {
        // ha / c ? t.ha / t.c
        if (ha * t.c != t.ha * c) return ha * t.c > t.ha * c;
        return id < t.id;
    }
};

int find(int x)
{
    if (p[x] != x) p[x] = find(p[x]);
    return p[x];
}

int main()
{
    cin >> n;

    int m = 0;
    for (int i = 0; i < n; i ++ )
    {
        int id, father, mother, k;
        cin >> id >> father >> mother >> k;

        st[id] = true;
        if (father != -1) e[m ++ ] = {id, father};
        if (mother != -1) e[m ++ ] = {id, mother};
        for (int j = 0; j < k; j ++ )
        {
            int son;
            cin >> son;
            e[m ++ ] = {id, son};
        }

        cin >> hc[id] >> ha[id];
    }

    for (int i = 0; i < N; i ++ ) p[i] = i, c[i] = 1;
    for (int i = 0; i < m; i ++ )
    {
        int a = e[i].a, b = e[i].b;

        st[a] = st[b] = true;
        int pa = find(a), pb = find(b);
        if (pa != pb)
        {
            if (pb > pa) swap(pa, pb);
            c[pb] += c[pa];
            hc[pb] += hc[pa];
            ha[pb] += ha[pa];
            p[pa] = pb;
        }
    }

    vector<Family> family;
    for (int i = 0; i < N; i ++ )
        if (st[i] && p[i] == i)
            family.push_back({i, c[i], hc[i], ha[i]});

    sort(family.begin(), family.end());

    cout << family.size() << endl;
    for (auto f : family)
        printf("%04d %d %.3lf %.3lf\n", f.id, f.c, (double)f.hc / f.c, (double)f.ha / f.c);

    return 0;
}

标签:PAT,fa,int,09,++,2021,ans,ha,id
来源: https://blog.csdn.net/weixin_45270761/article/details/120408157

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有