基因匹配(齐大第十一届校赛)

本文介绍了一个编程竞赛题目,Cola需要将2n种不同生物的基因匹配成n组,每组两个,且不能重复。基因分为A、B、C三种类型,特征值不同。匹配时,相同元素的基因计算难度小,不同元素则根据特征值差的绝对值计算难度。Cola的目标是最小化所有组的计算难度之和。代码实现了求解最小计算难度的算法,并给出了示例输入和输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

齐大第十一届校赛第三题

时间限制:1000ms     内存限制:65535KB

题目描述:

Cola 作为一位手搓单晶硅的硬核大佬,自然通晓许多魔法。
比如,他最近参加了生物竞赛,学习了┌ 神符 · 基因匹配┘,他可以对两种生物的基因进行分析匹配。老师为了考验 Cola ,便给他 2n 种不同生物的基因,要 Cola 分出 n 组进行分析匹配,每组一定由2种基因组成(基因不能重复使用)。这可把 Cola 难住了:“这已经超过了碳基生物的整活范畴了!”

原来,这 2∗n 种基因中,包含以 A 元素为基础的生物,以 B 元素为基础的生物和以 C 元素为基础的生物,它们还各自包含一个各自特征值 ai (1≤i≤2n)。

进行分析匹配时,如果这两种生物的基因以同一种元素为有机物质基础,对于 Cola 来说需要的计算难度可以忽略不记 ;
但是如果这两种生物的基因不以同一种元素为有机物质基础,那 Cola 计算他们的难度为它们特征值差的绝对值。

现在请您输出 Cola 进行这 n 组匹配计算难度总和的最小值。

输入格式:

第一行一个整数 n ,代表 Cola 要进行匹配的组数。
接下来的 2n 行,每行一个整数 ai 和一个字符 ci 。分别代表特征值和该生物有机物质基础的元素。其中 1≤n≤105 , 1≤ai≤1015 , ci∈{'A','B','C'} 。

输出格式:

一个整数,代表最小的计算难度总和。
代码实现:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
vector<ll> a[4];
ll n,t,ans,id[4]={0,1,2,3};
char ch;
ll mabs(ll num)
{
	return num>=0?num:-num;
}
ll slove(ll x,ll y)
{
	int l1=a[x].size(),l2=a[y].size();
	if(x>y)
	{
		swap(x,y);
		swap(l1,l2);
	}
	ll res=mabs(a[y].back()-a[x].front());
	for(int i=0;i<l1;i++)
	{
		int pos=upper_bound(a[y].begin(),a[y].end(),a[x][i])-a[y].begin();
		if(pos<l2)
			res=min(res,mabs(a[x][i]-a[y][pos]));
		if(pos!=0)
			res=min(res,mabs(a[x][i]-a[y][pos-1]));
	}
	return res;
}
bool cmp(ll x,ll y)
{
	return (a[x].size()%2) > (a[y].size()%2);
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	n*=2;
	for(int i=1;i<=n;i++)
	{
		cin>>t>>ch;
		a[ch-'A'+1].push_back(t);
	}
	for(int i=1;i<=3;i++)
		sort(a[i].begin(),a[i].end());
	sort(id+1,id+4,cmp);
	if(a[id[1]].size()%2!=0)
	{
		ans=slove(id[1],id[2]);
		if(a[id[3]].size())
			ans=min(ans,slove(id[1],id[3])+slove(id[2],id[3]));
	}
	cout<<ans<<endl;
	return 0;
}

本题为本次比赛防ak题,孩子不会。。。就先把答案放这啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值