[NOIP2005][CODEVS1106]篝火晚会(模拟+数学相关)

该博客详细介绍了NOIP2005中一道名为'篝火晚会'的题目。作者通过分析指出,从初始到最终状态的转换与反向转换代价相同,因此可以先构造最终状态再求最小代价。转移代价为不在正确位置上的人数,目标是使最多人处于正确位置。考虑环形排列,当一组人数移动步数相等时,令其中一人到位,其余也会到位。找到人数最多的这样一组,答案即为n - 组内人数。由于未指定旋转方向,需正反向计算并取最小值。
摘要由CSDN通过智能技术生成

题目描述

传送门

题解

首先知道从初状态转移到末状态和从末状态转移到初状态是一样的,那么我们可以构造出末状态,然后计算转移到初状态的最小代价。
可以知道转移的代价一定为不在应该在的位置上的人的数量,那么就要使最多的人在位置上。考虑到环的情况,我们假设对于一个数i的目标是将它放到i这个位置,那么如果有若干个数距离各自的目标需要移动的步数相等的话,说明令其中的一个数在位置上,那么其他的数也在位置上。假设这些数是一个组,找出有最多人数的那个组,那么ans=n-组内人数。
注意没有规定是顺时针还是逆时针,所以要正反做两次。

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;

const int max_n=5e4+5;

int n,L,R,t,ans;
int a[max_n],b[max_n],l[max_n],r[max_n],pre[max_n],nxt[max_n];
bool flag,vis[max_n];
int cnt1[max_n],cnt2[max_n];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值