当前位置: 首页 > news >正文

UVa 1620 Lazy Susan

题目描述

NNN 个弹珠,标号为 1,2,…,N1, 2, \ldots, N1,2,,N,它们被按任意顺序放置在一个环形轨道上。轨道顶部有一个“懒人转盘”(Lazy Susan\texttt{Lazy Susan}Lazy Susan),这是一个可以容纳恰好 444 个弹珠的托盘。托盘可以旋转 180∘180^\circ180 来反转 444 个弹珠的顺序,也可以沿着轨道在两个方向上移动。

目标是通过移动和旋转托盘,使得从某个位置开始沿顺时针方向列出弹珠时,得到顺序 (1,2,…,N)(1, 2, \ldots, N)(1,2,,N)

输入格式

输入文件包含多个测试数据。第一行是一个不超过 100100100 的正整数,表示测试数据组数。接下来描述各组数据:

  • 每组数据第一行是整数 NNN (8≤N≤5008 \leq N \leq 5008N500)
  • 第二行包含 NNN 个整数,表示按顺时针顺序列出的弹珠标签

输出格式

对于每组测试数据,输出一行:如果存在解决方案则输出 possible,否则输出 impossible

题目分析

关键操作分析

  1. 托盘旋转操作:反转连续 444 个弹珠的顺序
  2. 托盘移动操作:将托盘沿着轨道移动到相邻位置

这两种操作结合起来,实际上可以在环形轨道上反转任意连续 444 个弹珠的顺序

数学建模

这是一个排列群问题,我们需要分析这些操作对排列奇偶性的影响:

  1. 反转 444 个元素相当于执行 333 次相邻交换

    • 333 是奇数,所以每次反转操作都会改变排列的奇偶性
  2. 环形旋转相当于执行 N−1N-1N1 次相邻交换

    • NNN 为偶数时,N−1N-1N1 为奇数,旋转改变奇偶性
    • NNN 为奇数时,N−1N-1N1 为偶数,旋转不改变奇偶性

可达性分析

基于以上分析,我们可以得出以下结论:

  • NNN 为偶数时
    旋转操作可以改变奇偶性,反转操作也可以改变奇偶性,因此总是能够通过合适的操作序列达到目标状态。

  • NNN 为奇数时
    旋转操作不能改变奇偶性,只能依靠反转操作来改变奇偶性。由于反转操作总是改变奇偶性,我们需要初始排列的奇偶性与目标状态一致。目标状态 (1,2,…,N)(1, 2, \ldots, N)(1,2,,N) 是偶排列(逆序数为 000),因此需要初始排列也是偶排列。

最终结论

综合以上分析,我们得到简洁的判定条件:

possible  ⟺  (N mod 2=0)∨(inversionCount mod 2=0) \texttt{possible} \iff (N \bmod 2 = 0) \vee (\texttt{inversionCount} \bmod 2 = 0) possible(Nmod2=0)(inversionCountmod2=0)

其中 inversionCount\texttt{inversionCount}inversionCount 是初始排列的逆序数。

算法实现

时间复杂度

计算逆序数需要 O(N2)O(N^2)O(N2) 时间,对于 N≤500N \leq 500N500 完全可行。

代码实现

// Lazy Susan
// UVa ID: 1620
// Verdict: Accepted
// Submission Date: 2025-10-28
// UVa Run Time: 0.000s
//
// 版权所有(C)2025,邱秋。metaphysis # yeah dot net#include <bits/stdc++.h>using namespace std;int main() {cin.tie(0), cout.tie(0), ios::sync_with_stdio(false);int T; cin >> T;while (T--) {int marbleCount; cin >> marbleCount;vector<int> marbleSequence(marbleCount);// 读取弹珠序列for (int i = 0; i < marbleCount; ++i) cin >> marbleSequence[i];// 计算逆序数int inversionCount = 0;for (int i = 0; i < marbleCount; ++i)for (int j = i + 1; j < marbleCount; ++j)if (marbleSequence[i] > marbleSequence[j])inversionCount++;// 应用判定条件:N 为偶数或逆序数为偶数if (marbleCount % 2 == 0 || inversionCount % 2 == 0) cout << "possible\n";else cout << "impossible\n";}return 0;
}

总结

本题的关键在于理解操作对排列奇偶性的影响,通过数学分析得出简洁的判定条件。算法只需要计算一次逆序数,然后根据 NNN 的奇偶性进行判断,实现简单且高效。

http://www.dtcms.com/a/541263.html

相关文章:

  • 中国工程建筑门户网站官网房产网签
  • RabbitMQ事务机制详解
  • 网站开发人员的水平wordpress听说对百度不友好
  • 中国网站空间西安营销策划推广公司
  • 【AI工具】dify智能体-Kimi-K2+Mermaid ,一键生成系统架构图
  • 如何利用代理 IP 构建分布式爬虫系统架构?
  • 拿别的公司名字做网站凡科网站怎么修改昨天做的网站
  • Gin 框架中路由的底层实现原理
  • 公司网站开发费进什么费用利用小米路由器mini做网站
  • h5游戏免费下载:飞机炸弹?
  • 【c++ qt】QtConcurrent与QFutureWatcher:实现高效异步计算
  • puppeteer生成PDF实践
  • Windows桌面添加我的电脑
  • 响应式网站和非响应式网站的区别wordpress 兼容php7
  • 03.OpenStack界面管理
  • 深度学习与大模型完全指南:从神经网络基础到模型训练实战
  • 神经网络发展【深度学习】
  • 类似红盟的网站怎么做阿里巴巴官网登录
  • 自创字 网站php开源网站管理系统
  • Linux Shell 中静默登录另一台机器并执行SQL文件
  • Python 实战:Web 漏洞 Python POC 代码及原理详解(1)
  • 前端学习之八股和算法
  • dataonline.vn免费Web容器的使用
  • 进制转换器可视化
  • 第六部分:VTK进阶(第176章 高速等值面vtkFlyingEdges3D)
  • VSCode + Copilot
  • 网站后台管理系统权限个人品牌网站设计
  • 推送报错403怎么办?vscode推送项目到github
  • 【Linux专栏】多层变量的重定向赋值
  • 建设一个网站主要受哪些因素的影响因素设计得好的网站推荐