[构造]CodeForces 613C Necklace
2016-01-31 21:54
609 查看
题意:给n种珠子,第n种珠子个数为an,穿成一个项链,从项链的各各地方剪开,若项链为回文的,则漂亮值+1,求最大的漂亮值,并输出一种方案。
题解:构造。
分一下几种情况:
1)若珠子个数为奇数个的种类大于1,则方案数为0。随意输出。
2)ans=gcd(a1,a2....an) 再将珠子平分为ans份。在每份中若珠子个数为奇数个的种类大于1,则将两份合并成一份。每份将珠子对称放。放n份。最后输出。
代码:
题解:构造。
分一下几种情况:
1)若珠子个数为奇数个的种类大于1,则方案数为0。随意输出。
2)ans=gcd(a1,a2....an) 再将珠子平分为ans份。在每份中若珠子个数为奇数个的种类大于1,则将两份合并成一份。每份将珠子对称放。放n份。最后输出。
代码:
#include <cstdio> #include <iostream> #include <algorithm> using namespace std; int a[30],n; int b[101000]; int gcd(int x,int y) {return y?gcd(y,x%y):x;} int main() { cin >> n; int ans = 0,cnt = 0; for (int i = 1;i <= n;i++) cin >> a[i]; for (int i = 1;i <= n;i++) ans = gcd(ans,a[i]); for (int i = 1;i <= n;i++) cnt += a[i]&1; if (cnt > 1) { cout << 0 << endl; for (int i = 1;i <= n;i++) for (int j = 1;j <= a[i];j++) printf("%c",'a'+i-1); printf("\n"); return 0; } cnt = 0; for (int i = 1;i <= n;i++) a[i]/=ans,cnt+=a[i]&1; cout << ans << endl; if (cnt > 1) { ans /=2;for (int i = 1;i <= n;i++) a[i]*=2; } int m = 0; for (int i = 1;i <= n;i++) for (int j = 1;j <= a[i];j++) m++; int l = 1,r = m; for (int i = 1;i <= n;i++) for (int j = 1;j <= a[i]/2;j++) b[l++]=i,b[r--]=i; for (int i = 1;i <= n;i++) if (a[i]&1) b[l++]=i; while (ans--) for (int i = 1;i <= m;i++) printf("%c",b[i]+'a'-1); }
相关文章推荐
- cmd命令行杀进程
- linux命令startx报错
- Redis 源码分析(二) 一个 rehash 也不阻塞的哈希表
- C++builder 6的安装说明
- 在珠海的一年
- vxWorks FAQ中文版收藏-转载之上
- windows-安装mysql服务
- c语言:请编程序将“China”译成密码,分别用putchar和printf函数输出这5个字符。
- JavaScript菜鸟教程 output
- 基于AT89C51教程入门篇一
- yum本地源创建
- 在Makefile中可以使用函数来处理变量
- Linq to SQL 中datetime 和string转换
- 程序猿应该避免写凝视
- jQuery入门及各种选择器讲解
- 掌握需求过程2
- FileNe使用Invoke节点调用WebService手册
- hdoj 2020 绝对值排序
- Codeforces 618
- 2015欧冠决赛--脑力劳动结硕果