hihocoder1257(构造)(2015北京ACM/ICPC)
2015-11-22 15:54
477 查看
题意:
给你n条蛇,a[i]的长度为i,要求组成一个矩形。奇数蛇可折叠奇数次,偶数蛇折叠偶数次,然后按蛇的次序输出
(即一条蛇的输出只能是一个方向的)
2 3
1 2
1 3 2 3
1 1 2 1 2 2
2 5
1 4
1 5 2 5
1 1 2 1 2 2
1 2 1 3 2 3 2 4
3 5
3 4
1 4 1 5
2 4 2 5 3 5
2 2 2 3 3 3 3 2
3 1 2 1 1 1 1 2 1 3
思路:
构造的话一般都是找规律,通过前面的推出后面的:
首先我们可以发现矩形的长宽是取决于n
1: 1 1 2:1 2
3: 2 3 4:2 5
5: 3 4 6:3 7
然后是找矩形的关系
我们可以发现偶数矩形可以由它的前一个组成,即在后面加上
3: 1 3 3 4:1 3 3 4 4
2 2 3 2 2 3 4 4
然后看奇数矩形,通过长宽不停的从前找规律可以发现f
与f[n-3]有一定的关系
1 3 3 4 4 1 3 3 4 4 5 7
2 2 3 4 4 --> 2 2 3 4 4 5 7
6 6 6 5 5 5 7
6 6 6 7 7 7 7
给你n条蛇,a[i]的长度为i,要求组成一个矩形。奇数蛇可折叠奇数次,偶数蛇折叠偶数次,然后按蛇的次序输出
(即一条蛇的输出只能是一个方向的)
2 3
1 2
1 3 2 3
1 1 2 1 2 2
2 5
1 4
1 5 2 5
1 1 2 1 2 2
1 2 1 3 2 3 2 4
3 5
3 4
1 4 1 5
2 4 2 5 3 5
2 2 2 3 3 3 3 2
3 1 2 1 1 1 1 2 1 3
思路:
构造的话一般都是找规律,通过前面的推出后面的:
首先我们可以发现矩形的长宽是取决于n
1: 1 1 2:1 2
3: 2 3 4:2 5
5: 3 4 6:3 7
然后是找矩形的关系
我们可以发现偶数矩形可以由它的前一个组成,即在后面加上
3: 1 3 3 4:1 3 3 4 4
2 2 3 2 2 3 4 4
然后看奇数矩形,通过长宽不停的从前找规律可以发现f
与f[n-3]有一定的关系
1 3 3 4 4 1 3 3 4 4 5 7
2 2 3 4 4 --> 2 2 3 4 4 5 7
6 6 6 5 5 5 7
6 6 6 7 7 7 7
#include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> using namespace std; void fin(int cur) { if(cur == 1) { printf("1 1\n"); return ; } if(cur == 2) { printf("1 1\n"); printf("1 2 1 3\n"); return; } if(cur == 3) { printf("2 1\n"); printf("1 1 1 2\n"); printf("1 3 2 3 2 2\n"); return; } int tx = (cur+1)/2; int ty = (cur%2)? tx*2-1:tx*2+1; if(cur % 2 == 0) { fin(cur-1); for(int i = 1; i <= cur/2; i ++) printf("%d %d ",i,ty-1); for(int i = cur/2; i >= 1; i--) printf("%d %d ",i,ty); printf("\n"); return ; } else { fin(cur-3); for(int i = 1; i <= (cur-2)/2; i++) printf("%d %d ",i,ty-1); for(int i = 1; i <= (cur-2)/2+1; i++) printf("%d %d ",tx-1,ty-i); printf("\n"); for(int i = 1; i <= (cur-1)/2; i++) printf("%d %d ",tx-1,i); for(int i = 0; i <= (cur-1)/2-1; i++) printf("%d %d ",tx,(cur-1)/2-i); printf("\n"); for(int i = 0; i < cur/2+1; i++) printf("%d %d ",tx,ty-cur/2+i); for(int i = 0; i < cur/2; i++) printf("%d %d ",tx-i-1,ty); printf("\n"); return ; } } int main() { int n; while(scanf("%d",&n) != EOF) { printf("%d %d\n",(n+1)/2,(n%2)? (n+1)/2*2-1:(n+1)/2*2+1); fin(n); } return 0; }
相关文章推荐
- hihocoder1257(构造)(2015北京ACM/ICPC)
- 【BZOJ】3521: [Poi2014]Salad Bar
- SQL函数学习---------STUFF()函数
- bootStrap table实现分页
- 最小m段和问题
- 浏览器HTTP缓存原理分析
- linux搭建基于LNMP的wordpress博客
- ZZULIOJ 1783 简单的求和
- 修改注册表
- 信息安全系统设计基础第十周学习总结
- 角色访问动态生成用户权限菜单树
- 给Libgdx的ShapeRenderer开启抗锯齿
- 【BZOJ】3505: [Cqoi2014]数三角形
- 【BZOJ】3495: PA2010 Riddle
- 第十周实践项目~二叉树遍历思想解决问题
- 极光推送运行错误
- bootstrap 新手入门(三) 按钮组件
- learn go error
- 苏州OJ c005: 二叉树遍历
- HTML5矢量实现文件上传进度条