HDU_2838Cow Sorting

本文介绍了一种通过树状数组优化牛群排序的问题,旨在帮助Sherlock以最小时间成本将牛按暴躁程度升序排列。文章详细解析了算法思路,并提供了完整的C++实现代码。

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

Problem Description
Sherlock's N (1 ≤ N ≤ 100,000) cows are lined up to be milked in the evening. Each cow has a unique "grumpiness" level in the range 1...100,000. Since grumpy cows are more likely to damage Sherlock's milking equipment, Sherlock would like to reorder the cows in line so they are lined up in increasing order of grumpiness. During this process, the places of any two cows (necessarily adjacent) can be interchanged. Since grumpy cows are harder to move, it takes Sherlock a total of X + Y units of time to exchange two cows whose grumpiness levels are X and Y.

Please help Sherlock calculate the minimal time required to reorder the cows.
 

Input
Line 1: A single integer: N
Lines 2..N + 1: Each line contains a single integer: line i + 1 describes the grumpiness of cow i.
 

Output
Line 1: A single line with the minimal time required to reorder the cows in increasing order of grumpiness.
 

Sample Input
3 2 3 1
 

题意:

输入3,表示有3头牛要排序。2 3 1分别表示三头牛的暴躁水平。为了减少破坏,每相邻的两头牛可以互换使得全部牛按照暴躁程度递增的顺序排列。暴躁水平为交换时间。求最少交换时间。所以样例应该输出7.

2 3 1

第一次交换后顺序 2 1 3  ,花费时间1+3=4;

第二次交换后顺序1 2 3 ,花费时间1+2=3.所以共花去时间7=3+4.


思路解析:

对于当前数X,我们如果知道前面比它大的数有多少,假设为K,那么有部分代价(花费的时间)是确定的,那就是K*X;然后还得加上比它大的那些数之和,这就是当数列到X为止,排好所需要的最小代价。

求比它大的数的个数就是求逆序数,用树状数组完美解决,K1即是逆序对数(一定要__int64),接下来就是求总和,我们可以用get_sum(n)与get_sum(x)的差来表示(题目中数的范围为1-N)。

见代码:

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define N 100005
int n;
struct node
{
	int index;
	__int64 sum;
}c[N];
int lowbit(int x)
{
	return x&(-x);
}
void update(int x,int k,int s)
{
	while(x<=n)
	{
		c[x].index+=k;
		c[x].sum+=s;
		x+=lowbit(x);
	}
}
int getsum_index(int x)
{
	int ans=0;
	while(x>0)
	{
		ans+=c[x].index;
		x-=lowbit(x);
	}
	return ans;
}
__int64 getsum_sum(int x)
{
	__int64 ans=0;
	while(x>0)
	{
		ans+=c[x].sum;
		x-=lowbit(x);
	}
	return ans;
}
int main(void)
{
	while(scanf("%d",&n))
	{
		int i;

		__int64 ans=0;
		memset(c,0,sizeof(c));
		for(i=1;i<=n;i++)
		{
			int x;
			scanf("%d",&x);
			update(x,1,x);
			__int64 k1=i-getsum_index(x);
			if(k1!=0)
			{
				__int64 k2=getsum_sum(n)-getsum_sum(x);
				ans=ans+k1*x+k2;
			}

		}
		printf("%I64d\n",ans);
	}
}



内容概要:本文介绍了奕斯伟科技集团基于RISC-V架构开发的EAM2011芯片及其应用研究。EAM2011是一款高性能实时控制芯片,支持160MHz主频和AI算法,符合汽车电子AEC-Q100 Grade 2和ASIL-B安全标准。文章详细描述了芯片的关键特性、配套软件开发套件(SDK)和集成开发环境(IDE),以及基于该芯片的ESWINEBP3901开发板的硬件资源和接口配置。文中提供了详细的代码示例,涵盖时钟配置、GPIO控制、ADC采样、CAN通信、PWM输出及RTOS任务创建等功能实现。此外,还介绍了硬件申领流程、技术资料获取渠道及开发建议,帮助开发者高效启动基于EAM2011芯片的开发工作。 适合人群:具备嵌入式系统开发经验的研发人员,特别是对RISC-V架构感兴趣的工程师和技术爱好者。 使用场景及目标:①了解EAM2011芯片的特性和应用场景,如智能汽车、智能家居和工业控制;②掌握基于EAM2011芯片的开发板和芯片的硬件资源和接口配置;③学习如何实现基本的外设驱动,如GPIO、ADC、CAN、PWM等;④通过RTOS任务创建示例,理解多任务处理和实时系统的实现。 其他说明:开发者可以根据实际需求扩展这些基础功能。建议优先掌握《EAM2011参考手册》中的关键外设寄存器配置方法,这对底层驱动开发至关重要。同时,注意硬件申领的时效性和替代方案,确保开发工作的顺利进行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值