首页 > 其他分享 >51nod 石子分配

51nod 石子分配

时间:2024-09-08 17:04:10浏览次数:11  
标签:50010 51nod ll 石子 vis int avg 分配

image

可以发现步数限制把数轴变为了环。环之间不可以交换,环内相邻两点可以交换,然后我们只需要对每个环操作,最后累加。

对于环上的每个石子堆,我们需要将其石子数调整到均值 \(avg\)。因此,我们首先计算每个堆石子相对于 \(avg\) 的偏差,即 \(nowa[i] - avg\)。

因为相邻节点不一定能凑齐 \(avg\),所以我们用 \(b[]\) 数组累积偏差,累积这些偏差后,我们需要选择一个调整量,使得调整所需的总代价最小,那这个数肯定是中位数啊,所以我们环上的每个 \(b[i]\) 都减去中位数然后累加就是这个环的总的操作次数了。

完整代码有注释:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n,k; 
ll ans;
ll avg;//平均值 
ll b[50010];//记录累积偏差值
int nowa[50010];//这个环的第几的点 
int a[50010];//这堆石头数 
bool vis[50010];//判断这个点是否在环内 
ll get_ans(int x){
	int t=0;
	while(!vis[x]){//已经在环中了 
		vis[x]=1;
		nowa[++t]=a[x];
		x+=k;
		if(x>n){
			x-=n;
		}
	}
	b[1]=0;
	for(int i=2;i<=t;i++){
		b[i]=b[i-1]+(nowa[i-1]-avg);//累计偏移量 
	}
	sort(b+1,b+1+t);
	ll s1=b[(t+1)/2];//取中位数 
	ll nowans=0;
	for(int i=1;i<=t;i++){
		nowans+=abs(b[i]-s1);//取最小操作数 
	}
	return nowans;
}
int main() {
    ios::sync_with_stdio(false);
    cin>>n>>k;
    k++;
    for(int i=1;i<=n;i++){
    	cin>>a[i];
    	avg+=a[i];
	}
    avg/=n;
    for(int i=1;i<=n;i++){
    	if(vis[i]){//已经在环中了 
    		continue;
		}
		ans+=get_ans(i);
	}
    cout<<ans;
    return 0;
}

标签:50010,51nod,ll,石子,vis,int,avg,分配
From: https://www.cnblogs.com/sadlin/p/18403122

相关文章

  • 石子合并
    **(区间DP)**0.思路关键点:最后一次合并一定是左边连续的一部分和右边连续的一部分进行合并如何分类:最后一次分界线的位置来分类,分成k类之后,每一类取最小代价步骤:1.枚举[l,r]区间的长度2.对于每个长度的区间枚举起点————合并开始的位置for(inti=1;i+len-1<=......
  • C语言-第七章:字符和字符串函数、动态内存分配
    传送门:C语言-第六章-加餐:其他自定义类型目录第一节:字符和字符串函数    1-1.strlen函数和sizeof关键字    1-2.memcpy内存拷贝函数    1-3.memmove内存拷贝函数    1-4.memset内存设置函数    1-5.strtok字符串切割函数......
  • 51nod 1110 距离之和最小
    51nod1110距离之和最小考虑贪心取中位数,因为中位数到左边的点和右边的点的个数相同,更合理,权值的话可以转化为一个单点,然后没了。#include<bits/stdc++.h>usingnamespacestd;#definelllonglongintn;structss{ llx,w;}a[100005];boolcmp(ssg,ssh){ return......
  • C语言之动态内存分配与释放
    C语言之动态内存分配与释放通用指针类型void通用类型指针具有以下特点:类型无关,赋值灵活:由于指针本质上是一个存储内存地址的变量,而内存地址是没有类型的,所以void指针可以存储任意类型数据的地址,指向任意类型对象。无论是整数、浮点数、字符或数组、结构体等类型都可以用void指......
  • 51nod 1383 整数分解为2的幂
    整数分解为2的幂这题非常厉害,建议认真看下去虽然我讲的也不好。首先肯定先想到的是多重背包,可以把每个次幂当作物品,然后套板子。但是这题有\(O(n)\)复杂度的做法,我们想如果一个数\(i\)是奇数,那他只能由\((i-1)+1\)转化过来(2的幂次只有1是奇数),那方案数就是\(i-1\)的方案......
  • 51nod 2180 争渡
    争渡原题链接常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。——李清照《如梦令·常记溪亭日暮》给出线段上界和下界,要在严格递增地在区间内选数,问到最后一条线段的方案数。见上图,第\(i\)条线段\(j\)点的方案数为\(i-1\)条线段的\(j-1\)......
  • 【转载】golang内存分配
     同时Go对于GC后回收的内存页,并不是马上归还给操作系统,而是会延迟归还,用于满足未来的内存需求.  在1.10以前go的堆地址空间是线性连续扩展的,比如在1.10(linuxamd64)中,最大可扩展到512GB.因为go在gc的时候会根据拿到的指针地址来判断是否位于......
  • IPv6基于策略的地址分配
    IPv6基于策略的地址分配RA的周期性发送使用的是组播方式,但是针对RS的回复使用组播和单播两种可能;如果RA都是以组播方式发送,那么同一个广播域下的所有终端都可以收到,如果要基于终端mac/link-local地址来控制分配策略,则应该使用单播方式回复,以限制RA被接收的范围。关闭周期性......
  • 动态内存分配之realloc()函数详解
    目录一、函数简介二、函数原型参数返回值三、函数实现(伪代码)3.1.简化的realloc实现逻辑3.2.伪代码示例四、使用场景4.1.动态数组大小调整4.2.动态字符串大小调整4.3.内存优化4.4.复杂数据结构的内存管理4.5.跨函数内存管理4.6.灵活的内存分配策略五、......
  • 51nod 2842 城际旅行
    原题链接这题因为要求满足t时间内,所以用dp,不过我们的状态比较特殊,\(dp[i][j]\)表示到\(i\)点时经过\(j\)个点的最短时间,因为题目为DAG所以要用拓扑排序,每到一个点,枚举所有出边,更新出点的状态\(f[v][j+1]=min(f[v][j+1],f[u][j])\),最后的答案就是所有\(f[t][j]\let......