Codevs 1106 篝火晚会

Codevs 1106 篝火晚会

题目描述 Description

佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”。在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会。一共有n个同学,编号从1到n。一开始,同学们按照1,2,……,n的顺序坐成一圈,而实际上每个人都有两个最希望相邻的同学。如何下命令调整同学的次序,形成新的一个圈,使之符合同学们的意愿,成为摆在佳佳面前的一大难题。
佳佳可向同学们下达命令,每一个命令的形式如下:
(b1,b2,…bm-1,bm)
这里m的值是由佳佳决定的,每次命令m的值都可以不同。这个命令的作用是移动编号是b1,b2,…… bm –1,bm的这m个同学的位置。要求b1换到b2的位置上,b2换到b3的位置上,……,要求bm换到b1的位置上。
执行每个命令都需要一些代价。我们假定如果一个命令要移动m个人的位置,那么这个命令的代价就是m。我们需要佳佳用最少的总代价实现同学们的意愿,你能帮助佳佳吗?


输入输出(Input&Output)

输入描述 Input Description

输入第一行是一个整数n(3<=n<=50000),表示一共有n个同学。其后n行每行包括两个不同的正整数,以一个空格隔开,分别表示编号是1的同学最希望相邻的两个同学的编号,编号是2的同学最希望相邻的两个同学的编号,……,编号是n的同学最希望相邻的两个同学的编号。

输出描述 Output Description

这一行只包含一个整数,为最小的总代价。如果无论怎么调整都不能符合每个同学的愿望,则输出-1。


样例 Sample

样例输入 Sample Input

4
3 4
4 3
1 2
1 2

样例输出 Sample Output

2


数据范围及提示 Data Size & Hint

【数据规模】
对于30%的数据,n<=1000;
对于全部的数据,n<=50000。

分析

呃呃,从网上阅读多份题解后的总结。因为该题所说指定b1,b2,b3,…bm转,并没有要求必须连续的一些人,所以最小的交换代价就是当前状态1,2,3,4,5,··········n到目标状态的最小区别,因为是环状的,所以可以以任意一部分开始,由此那么移动负数位和移动n+负数位实质上是相同的。因为初始状态是有序的,递增顺序,所以,当差值相同的数同时移动相同位数时其与本身位置的差值是不变的,当差值为0时显然便是在正确的位置。

因为移动的最小次数便是1,所以只需求出一次要移动多少人,因为差值始终是不变的所以只需找出差值相同的最多人数,用总人数去减去即可,因为只要差值相同了,只要整体转便可得到集体差值为0,而集体转动不需要去换人,因为是循环的只要更改起始点即可,也就是等价于差值为0。

代码如下

program p1106;
var n,i,j,delta,maxn:longint;
    deltax:array[0..50000] of longint;
    num:array[1..50000,1..2] of longint;
    can:array[1..50000] of boolean;
    f:array[-3..50000]of longint;
function max(a,b:longint):longint;
begin
 if a>b then exit(a);
 exit(b);
end;
function swap(var a,b:longint):longint;
var c:longint;
begin
 c:=a;
 a:=b;
 b:=c;
end;

begin
 readln(n);
 for i:=1 to n do
  read(num[i,1],num[i,2]);
 f[1]:=1;
 i:=1;
 can[1]:=true;
 while i<n do
  begin
   i:=i+1;
   if f[i-2]=num[f[i-1],2]
    then
     swap(num[f[i-1],2],num[f[i-1],1]);
   if not can[num[f[i-1],2]]
    then
     begin
      f[i]:=num[f[i-1],2];
      can[f[i]]:=true;
     end
    else
     begin
      write(-1);
      close(input);
      close(output);
      halt;
     end;
  end;
 for i:=1 to n do
  begin
   delta:=f[i]-i;
   if delta<0
    then
     begin
      delta:=delta+n;
     end;
   inc(deltax[delta]);
   maxn:=max(maxn,deltax[delta]);
  end;
 fillchar(deltax,sizeof(deltax),0);
 for i:=n downto 1 do
  begin
   delta:=f[n-i+1]-i;
   if delta<0
    then
     delta:=delta+n;
   inc(deltax[delta]);
   maxn:=max(maxn,deltax[delta]);
  end;
 write(n-maxn);
end.

Starlight


这里写图片描述


翡冷翠的一夜

               —— 徐志摩

你真的走了,明天?那我,那我,……
你也不用管,迟早有那一天;
你愿意记着我,就记着我,
要不然趁早忘了这世界上
有我,省得想起时空着恼,
只当是一个梦,一个幻想;
只当是前天我们见的残红,
怯怜怜的在风前抖擞,一瓣,
两瓣,落地,叫人踩,变泥……
唉,叫人踩,变泥——变了泥倒干净,
这半死不活的才叫是受罪,
看着寒伧,累赘,叫人白眼——
天呀!你何苦来,你何苦来……
我可忘不了你,那一天你来,
就比如黑暗的前途见了光彩,
你是我的先生,我爱,我的恩人,
你教给我什么是生命,什么是爱,
你惊醒我的昏迷,偿还我的天真。
没有你我哪知道天是高,草是青?
你摸摸我的心,它这下跳得多快;
再摸我的脸,烧得多焦,亏这夜黑
看不见;爱,我气都喘不过来了,
别亲我了;我受不住这烈火似的活,
这阵子我的灵魂就象是火砖上的
熟铁,在爱的槌子下,砸,砸,火花
四散的飞洒……我晕了,抱着我,
爱,就让我在这儿清静的园内,
闭着眼,死在你的胸前,多美!
头顶白杨树上的风声,沙沙的,
算是我的丧歌,这一阵清风,
橄榄林里吹来的,带着石榴花香,
就带了我的灵魂走,还有那萤火,
多情的殷勤的萤火,有他们照路,
我到了那三环洞的桥上再停步,
听你在这儿抱着我半暖的身体,
悲声的叫我,亲我,摇我,咂我,……
我就微笑的再跟着清风走,
随他领着我,天堂,地狱,哪儿都成,
反正丢了这可厌的人生,实现这死
在爱里,这爱中心的死,不强如
五百次的投生?……自私,我知道,
可我也管不着……你伴着我死?
什么,不成双就不是完全的“爱死”,
要飞升也得两对翅膀儿打伙,
进了天堂还不一样的要照顾,
我少不了你,你也不能没有我;
要是地狱,我单身去你更不放心,
你说地狱不定比这世界文明
(虽则我不信,)象我这娇嫩的花朵,
难保不再遭风暴,不叫雨打,
那时候我喊你,你也听不分明,——
那不是求解脱反投进了泥坑,
倒叫冷眼的鬼串通了冷心的人,
笑我的命运,笑你懦怯的粗心?
这话也有理,那叫我怎么办呢?
活着难,太难就死也不得自由,
我又不愿你为我牺牲你的前程……
唉!你说还是活着等,等那一天!
有那一天吗?——你在,就是我的信心;
可是天亮你就得走,你真的忍心
丢了我走?我又不能留你,这是命;
但这花,没阳光晒,没甘露浸,
不死也不免瓣尖儿焦萎,多可怜!
你不能忘我,爱,除了在你的心里,
我再没有命;是,我听你的话,我等,
等铁树儿开花我也得耐心等;
爱,你永远是我头顶的一颗明星:
要是不幸死了,我就变一个萤火,
在这园里,挨着草根,暗沉沉的飞,
黄昏飞到半夜,半夜飞到天明,
只愿天空不生云,我望得见天
天上那颗不变的大星,那是你,
但愿你为我多放光明,隔着夜,
隔着天,通着恋爱的灵犀一点……
六月十一日,一九二五年翡冷翠山中[1]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值