《算法竞赛进阶指南》 雪花雪花雪花

该博客介绍了如何在算法竞赛中解决雪花形状相同性问题。通过使用哈希和数组的字典序最小表示,利用双指针方法在O(N)时间内确定6位数据的最小字典序,从而判断是否存在相同的雪花。文章特别提到了一个特判情况,即当移动6位时,数据完全相同的情况。
摘要由CSDN通过智能技术生成

雪花雪花雪花

有N片雪花,每片雪花由六个角组成,每个角都有长度。

第i片雪花六个角的长度从某个角开始顺时针依次记为ai,1,ai,2,…,ai,6。

因为雪花的形状是封闭的环形,所以从任何一个角开始顺时针或逆时针往后记录长度,得到的六元组都代表形状相同的雪花。

例如ai,1,ai,2,…,ai,6和ai,2,ai,3,…,ai,6,ai,1就是形状相同的雪花。

ai,1,ai,2,…,ai,6和ai,6,ai,5,…,ai,1也是形状相同的雪花。

我们称两片雪花形状相同,当且仅当它们各自从某一角开始顺时针或逆时针记录长度,能得到两个相同的六元组。

求这N片雪花中是否存在两片形状相同的雪花。

输入格式
第一行输入一个整数N,代表雪花的数量。

接下来N行,每行描述一片雪花。

每行包含6个整数,分别代表雪花的六个角的长度(这六个数即为从雪花的随机一个角顺时针或逆时针记录长度得到)。

同行数值之间,用空格隔开。

输出格式
如果不存在两片形状相同的雪花,则输出:

No two snowflakes are alike.

如果存在两片形状相同的雪花,则输出:

Twin snowflakes found.

数据范围
1≤n≤100000,
0≤ai,j<10000000
输入样例:
2
1 2 3 4 5 6
4 3 2 1 6 5
输出样例:
Twin snowflakes found.

本题用到的办法是哈希,即我们对于每一片雪花都用一个特定的“公式”计算后得到一个唯一“数据”,这样只要有相同的“数据”就说明存在相同的雪花。

这里我们用到的“公式”是数组的字典序最小表示,下面我们介绍利用双指针的方法确定6位数据的最小字典序(本方法的时间复杂度是O(N)的可以推广到求n位数组的最小字典序)

在这里插入图片描述

上面还有一个特例当移动k位时,k=6,i、j两指针的数据都相同,则说明这6位数据都是相同的,具体可以思考,这个特判也要表现在代码中。

具体看代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=100010;
int n;
int snows[N][6],idx[N];
void get_min(int *b)
{
   
	 int a[12];
	//复制雪花到最后这样每次以当前位开始遍历6位,就能达到遍历所有的情况
	for(int i=0;i<12;i++)
		a[i]=b[i
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值