題目
模擬,構造出整個數列,要求的就是這個數列需要經過多少次操作得到
但是,這其實是乙個環,編號為1的可以放任意乙個位置,每一位都可以右移一位,最右邊的一位移到第一位(後文直接叫右移)。
而且,第乙個人可以選擇左邊a[1],右邊b[1],也可以左邊b[1],右邊a[1],所以環還可以倒過來。
比如題中所給資料:
4 3 4
4 3
1 2
1 2
假設第一位是1,那整個數列可以是1 3 2 4,也可以是1 4 2 3。
可以發現,右邊的倒過來,就變成3 2 4 1,和左邊是一樣的。
考慮正著的情況(反著也一樣)
假設右移k次是最優解,右移過以後與原數列有t個不同,那交換的代價就是t,那就可以設ans[i]表示右移i位後與原數列有ans[i]個相同,
那麼答案=max=n-max
#include
using
namespace
std;
const
int n=50002;
int n,i,ans,a[n],b[n],h[n],ans1[n],ans2[n];
inline
char gc()
#define gc getchar
inline
int read()
inline
void write(int a)
inline
void writeln(int a)
int main()
for (i=1;i<=n;i++) ans1[(h[i]-i+n)%n]++,ans2[(h[i]+i)%n]++;
//計算ans,其中ans1是正著來的,ans2是倒著
for (i=0;iprintf("%d",n-ans);
}
洛谷 P1053 篝火晚會
佳佳剛進高中,在軍訓的時候,由於佳佳吃苦耐勞,很快得到了教官的賞識,成為了 小教官 在軍訓結束的那天晚上,佳佳被命令組織同學們進行篝火晚會。一共有nn n個同學,編號從11 1到nn n。一開始,同學們按照1,2,n1,2,n1,2,n的順序坐成一圈,而實際上每個人都有兩個最希望相鄰的同學。如何下命...
P1053 篝火晚會
至於思路以及 解釋,個人覺得洛谷的題解已經很清楚了,故就不多解釋了 有一點不是很清楚,就是如果將c陣列的初始值定義為 正 c 0 1 c 1 l 1 反 c 0 1 c 1 r 1 時會wa乙個點,但在我看來好像並沒有什麼區別,如果有人知道,可以在下面告訴我,萬分感謝 include include...
洛谷P1053篝火晚會題解 zhengjun
題目描述 佳佳剛進高中,在軍訓的時候,由於佳佳吃苦耐勞,很快得到了教官的賞識,成為了 小教官 在軍訓結束的那天晚上,佳佳被命令組織同學們進行篝火晚會。一共有n nn個同學,編號從1 11到n nn。一開始,同學們按照1,2 n 1,2,n 1,2,n的順序坐成一圈,而實際上每個人都有兩個最希望相鄰的...