Run ID:58077

提交时间:2023-09-19 15:41:24

#include <iostream> using namespace std; int target[50001], initial[50001], people[50001][3], pluss[50001], minuss[50001]; //存储目标链,初始链,每个人最希望相邻的两个同学的编号,正序相同人数以及逆序相同人数 inline int read() { int s = 0, w = 1; char ch = getchar(); while(ch < '0' || ch > '9'){ if(ch=='-') w=-1; ch=getchar(); } while(ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch = getchar(); return s * w; } int main() { int n; n = read(); for (int i = 1; i <= n; i++) //读入编号是 i 的同学最希望相邻的两个同学的编号 people[i][1] =read(), people[i][2] = read(); target[1] = 1; target[2] = people[1][2]; //构建目标链 initial[1] = 1; initial[n] = n; //构建初始链 for (int i = 2; i <= n - 1; i++) { initial[i] = i; //构建初始链 if (target[i - 1] == people[target[i]][1]) target[i + 1] = people[target[i]][2]; else if (target[i - 1] == people[target[i]][2]) target[i + 1] = people[target[i]][1]; //构建目标链 else{ cout << -1 << endl; //第 i 个人希望相邻的人旁边没有空位了,无法构建目标链(一个悲伤的故事) return 0; } } int ans = 0; for(int i = 1; i <= n; i++){ pluss[(target[i] - initial[i] + n) % n]++; //顺时针从 1 ~ n 跑一遍 minuss[(target[i]- initial[n - initial[i] + 1] + n) % n]++; //逆时针从 n ~ 1 跑一遍差 } for (int i = 0; i <= n - 1; i++) ans = max(ans, max(pluss[i], minuss[i])); //找差值人数最多的 cout << n - ans; //总人数 - 不用移动的人数 = 需要移动的人数,也就是答案 return 0; }