手链样式

小明有3颗红珊瑚,4颗白珊瑚,5颗黄玛瑙。

他想用它们串成一圈作为手链,送给女朋友。

现在小明想知道:如果考虑手链可以随意转动或翻转,一共可以有多少不同的组合样式呢?

请你提交该整数。

不要填写任何多余的内容或说明性的文字。

Ideas

这是一个排列组合问题,一共有 12 个位置,可以先从中选出 3 个,放红珊瑚,然后从剩下的 9 个中选出 4 个放白珊瑚,剩余的 5 个位置放黄玛瑙。

这道题只是一道填空题,所以可以用一些语言自带的全排列函数,但是需要做一些去重的操作。

手链可以随意转动,相当于将排列进行右移操作,所以将上面的结果除以 12。

手链还能够翻转,也就是说必须保证对称轴两边的石头不同类型数量相等,所以必须由红珊瑚和黄玛瑙作为对称轴。

对称轴两边分别放 5 个石头,从 5 个位置里面选 2 个放白珊瑚,然后从剩下的 3 个位置中选 2 个放黄玛瑙。

考虑到翻转的情况,将上面的结果除以 2,然后再加上一个对称的操作。所以这道题其实是可以通过纯数学计算的方式得出结果的。

不过作为一名勤勤恳恳的码农,不写点代码总觉得难受,所以下面的代码是通过全排列+去重的方式实现的。

Code

C++

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>using namespace std;int main(int argc, const char *argv[]) {string s = "aaabbbbccccc";vector<string> v1;int ans = 0;do {//排出重复,对于v1中的每个元素进行检查,如果存在s的旋转或者翻转,则跳过int i = 0;for (; i < v1.size(); ++i) {if (v1[i].find(s) != string::npos)break;}//s不可用的情况if (i != v1.size())continue;string s2 = s + s;v1.push_back(s2);//用于判断旋转的情况reverse(s2.begin(), s2.end());v1.push_back(s2);//将s的翻转放入vector中ans++;} while (next_permutation(s.begin(), s.end()));cout << ans << endl;return 0;
}

Python

from itertools import permutationsif __name__ == '__main__':ans, cnt = set(), 0nums = ['1', '1', '1', '2', '2', '2', '2', '3', '3', '3', '3', '3']for item in permutations(nums):string = ''.join(item)if string not in ans:  # 如果这种样式之前已经遇到过print(string)string2 = string + stringfor i in range(len(nums)):ans.add(string2[i:i + 12])string2 = string2[::-1]  # 考虑翻转的情况for i in range(len(nums)):ans.add(string2[i:i + 12])cnt += 1print(cnt)

Answer: 1170

2015年第六届蓝桥杯 - 省赛 - C/C++大学A组 - G. 手链样式相关推荐

  1. 2015年第六届蓝桥杯 - 省赛 - C/C++大学B组 - F. 加法变乘法

    加法变乘法 我们都知道:1+2+3+ - + 49 = 1225. 现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如:1+2+3+-+10 * 11+12+-+27 * 28+29+ ...

  2. 2015年第六届蓝桥杯 - 省赛 - C/C++大学A组 - B. 星系炸弹

    星系炸弹 在X星系的广袤空间中漂浮着许多X星人造"炸弹",用来作为宇宙中的路标. 每个炸弹都可以设定多少天之后爆炸. 比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在2 ...

  3. 2015年第六届蓝桥杯 - 省赛 - C/C++大学C组 - B. 立方尾不变

    立方尾不变 有些数字的立方的末尾正好是该数字本身. 比如:1,4,5,6,9,24,25,- 请你计算一下,在10000以内的数字中(指该数字,并非它立方后的数值),符合这个特征的正整数一共有多少个. ...

  4. 2015年第六届蓝桥杯 - 省赛 - C/C++大学C组 - A. 隔行变色

    隔行变色 Excel表的格子很多,为了避免把某行的数据和相邻行混淆,可以采用隔行变色的样式. 小明设计的样式为:第1行蓝色,第2行白色,第3行蓝色,第4行白色,- 现在小明想知道,从第21行到第50行 ...

  5. 2015年第六届蓝桥杯 - 省赛 - C/C++大学B组 - H.移动距离

    移动距离 X星球居民小区的楼房全是一样的,并且按矩阵样式排列. 其楼房的编号为1,2,3- 当排满一行时,从下一行相邻的楼往反方向排号. 比如:当小区排号宽度为6时,开始情形如下: 1 2 3 4 5 ...

  6. 2015年第六届蓝桥杯 - 省赛 - C/C++大学B组 - C. 三羊献端

    三羊献瑞 观察下面的加法算式: 祥 瑞 生 辉+ 三 羊 献 瑞 -------------------三 羊 生 瑞 气 (如果有对齐问题,可以参看[图1.jpg]) 其中,相同的汉字代表相同的数字 ...

  7. 2015年第六届蓝桥杯 - 省赛 - C/C++大学B组 - A. 奖券数目

    奖券数目 有些人很迷信数字,比如带"4"的数字,认为和"死"谐音,就觉得不吉利. 虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求. 某抽奖活动的奖券号码是5 ...

  8. 2015年第六届蓝桥杯 - 省赛 - C/C++大学A组 - I. 垒骰子

    垒骰子 赌圣atm晚年迷恋上了垒骰子,就是把骰子一个垒在另一个上边,不能歪歪扭扭,要垒成方柱体. 经过长期观察,atm 发现了稳定骰子的奥秘:有些数字的面贴着会互相排斥! 我们先来规范一下骰子:1 的 ...

  9. 2015年第六届蓝桥杯 - 省赛 - C/C++大学A组 - A. 方程整数解

    方程整数解 方程: a^2 + b^2 + c^2 = 1000 (或参见[图1.jpg]) 这个方程有正整数解吗?有:a,b,c=6,8,30 就是一组解. 你能算出另一组合适的解吗? 请填写该解中 ...

最新文章

  1. FPGA中时钟相关概念
  2. ubuntu nginx php-fpm mysql_Ubuntu下安装Nginx,PHP5(及PHP-FPM),MySQL
  3. php swoole process,Swoole_process实现进程池的方法
  4. 【机器学习】深度剖析 LightGBM vs XGBOOST 哪个更胜一筹
  5. WSL2 支持挂载物理磁盘,Windows 可直接访问 ext4
  6. 06-Flutter移动电商实战-dio基础_Get_Post请求和动态组件协作
  7. 特斯拉最强自动驾驶系统登场,实测视频火热出炉
  8. 鸿蒙系统在哪里,“安卓系统”和“鸿蒙系统”区别在哪里?网友:根本就是一个天上一个地下...
  9. 图书馆借书系统c语言,急求程序!!!简单图书馆借/还书管理子系统
  10. Day05 郝斌C语言自学视频之C语言的函数
  11. 外企重修课:商人高通、任性微软、老姜IBM
  12. blendshape变形器详细解释
  13. 为什么我不给孩子看国产动漫?看看这5部法国动漫,你就知道了!【转】
  14. java 运行配置_JAVA运行环境配置
  15. css基础知识(尺寸、字体、文本、背景、列表)
  16. BAT、网易面试经验收集
  17. 爪哇语:??????? 字面量,分类和存储库
  18. 倾斜摄影超大场景的三维模型的顶层合并,提升模型在WEB三维展示效果
  19. springboot集成graphql(一)
  20. python unpacking_python packing unpacking 组包解包

热门文章

  1. Hadoop HDFS (3) JAVA訪问HDFS之二 文件分布式读写策略
  2. java.util.concurrent介绍【转】
  3. 文本框不可编辑,只可使用帮助的解…
  4. sql分割以逗号隔开的字符串
  5. [MSDN]每个开发人员现在应该下载的十种必备工具
  6. Java黑皮书课后题第7章:*7.13(随机数选择器)编写一个方法,返回1到54之间的随机数,但不能是传递到实参中的数。指定如下方法头
  7. Java黑皮书课后题第5章:*5.14(计算最大公约数)下面是求两个整数n1和n2的最大公约数的程序清单5-9的另一种解法:...提示用户输入两个正整数,然后显示最大公约数
  8. php编译freetds,Linux 下 PHP 5.2.x 连接 SQL Server 数据库 FreeTDS 配置笔记
  9. 【2012百度之星/初赛上】B:小小度刷礼品
  10. DWR推送的一些随笔