ACdream 1429 Rectangular Polygon
来源:互联网 发布:淘宝手机视频尺寸大小 编辑:程序博客网 时间:2024/04/19 14:14
Problem Description
A rectangular polygon is a polygon whose edges are all parallel to the coordinate axes. The polygon must have a single, non-intersecting boundary. No two adjacent sides must be parallel.
Johnny has several sticks of various lengths. He would like to construct a rectangular polygon. He is planning to use sticks as horizontal edges of the polygon, and draw vertical edges with a pen.
Now Johnny wonders, how many sticks he can use. Help him, find the maximal number of sticks that Johnny can use. He will use sticks only as horizontal edges.
Input
Output
. If no polygon can be constructed, output l = 0.
Sample Input
41 2 3 541 2 4 841 1 1 1
Sample Output
30 01 01 13 13 20 2040 01 01 12 12 -21 -21 -10 -1
Hint
单组数据
In the first example Johnny uses a stick of length 1 for (0, 0)−(1, 0) edge, a stick of length 2 for (1, 1)−(3, 1) edge and a stick of length 3 for (3, 2) − (0, 2) edge. There is no way to use all four sticks.
Source
Manager
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
动规~
做了两天的题,思路不难,但是写起来很麻烦……而且最后还要求输出组成最大值的边的位置,一脸懵啊……方法还真是神奇,用了一个fa数组记录前继边的长度,最后用l和r递推输出~
其实题目就相当于是用小木棍拼成两条长度相等的边使得它们最长,用f[i][j]表示已用i根木棍,上下差值为j的最大长度,C++要再加上20000(100*200)防止下表出现负数。
数组开小了循环总是莫名其妙地终止……后来才发现真是纠结啊……
#include<cstdio>#include<cstring>int n,a[101],f[101][40001],ans1[101],ans2[101],l,r,fa[101][40001],now;int main(){while(scanf("%d",&n)==1){memset(f,-1,sizeof(f));f[0][20000]=0;for(int i=1;i<=n;i++) scanf("%d",&a[i]);l=r=20000;for(int i=1;i<=n;i++){for(int j=l;j<=r;j++){if(f[i-1][j]<=-1) continue;if(f[i][j]<f[i-1][j]){f[i][j]=f[i-1][j];fa[i][j]=j;}if(f[i][j+a[i]]<f[i-1][j]+1){f[i][j+a[i]]=f[i-1][j]+1;fa[i][j+a[i]]=j;}if(f[i][j-a[i]]<f[i-1][j]+1){f[i][j-a[i]]=f[i-1][j]+1;fa[i][j-a[i]]=j;}}l-=a[i];r+=a[i];}printf("%d\n",f[n][20000]);now=20000;ans1[0]=ans2[0]=0;for(int i=n;i>=1;i--){int k=fa[i][now];if(k<now) ans1[++ans1[0]]=now-k;if(k>now) ans2[++ans2[0]]=k-now;now=k;}l=r=0;for(int i=1;i<=ans2[0];i++){r++;printf("%d %d\n",l,r);l+=ans2[i];printf("%d %d\n",l,r);}r=0;for(int i=1;i<=ans1[0];i++){r--;printf("%d %d\n",l,r);l-=ans1[i];printf("%d %d\n",l,r);}}return 0;}
- ACdream 1429 Rectangular Polygon
- ACdream 1429 Rectangular Polygon
- ACdream 1429 Rectangular Polygon (DP)
- acdream 1429 Rectangular Polygon【dp】
- acdream1429 rectangular polygon
- Andrew Stankevich Contest 23 G - Rectangular Polygon
- Problem G. Rectangular Polygon(dp + 转移重现)
- polygon
- Polygon
- ACdream
- Acdream
- ACdream
- ACdream
- ACdream
- ACdream
- ACdream
- ACdream
- ACdream
- mysql之通过日志定时备份和恢复(下)
- 微信开发a标签跳转后点击返回键无法返回
- 创新+工匠,TCL推XESS重定义电视行业“高端”内涵
- Linux学习笔记 --- centos7下安装pymssql
- 修改unity3d创建的脚本模版
- ACdream 1429 Rectangular Polygon
- 人生这本书啊,接上回说到
- iOS知识点
- 沉浸式开发
- 前端开发面试题
- HW3000应用于无线烟感系统
- Java四种线程池的使用
- C++:argc和argv示例
- linux--9个使用前必须再三小心的Linux命令