Code Forces 581 D. Three Logos(计算几何)
2015-10-09 22:36
751 查看
Description
给出三种海报A,B,C的长和宽,问能否将这三张海报毫无缝隙的放在一个正方形的框中,如果可以则输出这个正方形框的边长并将贴完海报的这个正方形矩阵输出,否则输出-1
Input
六个整数分别表示这三张海报的长和宽
Output
如果存在合法的贴海报方案则输出,否则输出-1
Sample Input
5 1 2 5 5 2
Sample Output
5
AAAAA
BBBBB
BBBBB
CCCCC
CCCCC
Solution
令a[i]和b[i]分别为第i张海报的长和宽,对输入的a和b令较大值在a[i]中,首先累计这三张海报的面积s判断其是否为完全平方数,不是显然不合法,是的话令len=sqrt(n)为正方形框的边长,那么合法方案有五种:
1.a[0]=a[1]=a[2]=len,b[0]+b[1]+b[2]=len;
2.a[i]=len,a[j]=a[k]=len-b[i],b[j]+b[k]=len;
3.a[i]=len,a[j]=b[k]=len-b[i],b[j]+a[k]=len;
4.a[i]=len,b[j]=a[k]=len-b[i],a[j]+b[k]=len;
5.a[i]=len,b[j]=b[k]=len-b[i],a[j]+a[k]=len;
式中j=(i+1)%3,k=(i+2)%3,i=0,1,2
Code
给出三种海报A,B,C的长和宽,问能否将这三张海报毫无缝隙的放在一个正方形的框中,如果可以则输出这个正方形框的边长并将贴完海报的这个正方形矩阵输出,否则输出-1
Input
六个整数分别表示这三张海报的长和宽
Output
如果存在合法的贴海报方案则输出,否则输出-1
Sample Input
5 1 2 5 5 2
Sample Output
5
AAAAA
BBBBB
BBBBB
CCCCC
CCCCC
Solution
令a[i]和b[i]分别为第i张海报的长和宽,对输入的a和b令较大值在a[i]中,首先累计这三张海报的面积s判断其是否为完全平方数,不是显然不合法,是的话令len=sqrt(n)为正方形框的边长,那么合法方案有五种:
1.a[0]=a[1]=a[2]=len,b[0]+b[1]+b[2]=len;
2.a[i]=len,a[j]=a[k]=len-b[i],b[j]+b[k]=len;
3.a[i]=len,a[j]=b[k]=len-b[i],b[j]+a[k]=len;
4.a[i]=len,b[j]=a[k]=len-b[i],a[j]+b[k]=len;
5.a[i]=len,b[j]=b[k]=len-b[i],a[j]+a[k]=len;
式中j=(i+1)%3,k=(i+2)%3,i=0,1,2
Code
#include<stdio.h> #include<math.h> void swap(int *a,int *b) { int t=*a; *a=*b; *b=t; } int main() { int a[4],b[4],l,s,flag; while(~scanf("%d%d%d%d%d%d",&a[0],&b[0],&a[1],&b[1],&a[2],&b[2])) { flag=s=0; for(int i=0;i<3;i++) { s+=a[i]*b[i];//累加面积 if(a[i]<b[i])//长>宽 swap(&a[i],&b[i]); } l=sqrt(s*1.0); if(l*l==s)//s是完全平方数 { for(int i=0;i<3;i++) if(a[i]==l) { int j=(i+1)%3,k=(i+2)%3; if(a[j]==l&&a[k]==l&&b[i]+b[j]+b[k]==l)//Situation 1 { flag=1; printf("%d\n",l); for(int ii=1;ii<=l;ii++) { if(ii<=b[i]) for(int jj=1;jj<=l;jj++)printf("%c",'A'+i); else if(ii<=b[i]+b[j]) for(int jj=1;jj<=l;jj++)printf("%c",'A'+j); else for(int jj=1;jj<=l;jj++)printf("%c",'A'+k); printf("\n"); } break; } else if(a[j]==a[k]&&a[j]+b[i]==l&&b[j]+b[k]==l)//Situation 2 { flag=1; printf("%d\n",l); for(int ii=1;ii<=l;ii++) { if(ii<=b[i]) for(int jj=1;jj<=l;jj++)printf("%c",'A'+i); else { for(int jj=1;jj<=l;jj++) if(jj<=b[j])printf("%c",'A'+j); else printf("%c",'A'+k); } printf("\n"); } break; } else if(b[j]==b[k]&&b[j]+b[i]==l&&a[j]+a[k]==l)//Situation 3 { flag=1; printf("%d\n",l); for(int ii=1;ii<=l;ii++) { if(ii<=b[i]) for(int jj=1;jj<=l;jj++)printf("%c",'A'+i); else { for(int jj=1;jj<=l;jj++) if(jj<=a[j])printf("%c",'A'+j); else printf("%c",'A'+k); } printf("\n"); } break; } else if(a[j]==b[k]&&a[j]+b[i]==l&&b[j]+a[k]==l)//Situation 4 { flag=1; printf("%d\n",l); for(int ii=1;ii<=l;ii++) { if(ii<=b[i]) for(int jj=1;jj<=l;jj++)printf("%c",'A'+i); else { for(int jj=1;jj<=l;jj++) if(jj<=b[j])printf("%c",'A'+j); else printf("%c",'A'+k); } printf("\n"); } break; } else if(a[k]==b[j]&&a[k]+b[i]==l&&a[j]+b[k]==l)//Situation 5 { flag=1; printf("%d\n",l); for(int ii=1;ii<=l;ii++) { if(ii<=b[i]) for(int jj=1;jj<=l;jj++)printf("%c",'A'+i); else { for(int jj=1;jj<=l;jj++) if(jj<=a[j])printf("%c",'A'+j); else printf("%c",'A'+k); } printf("\n"); } break; } } } if(!flag)printf("-1\n");//无解 } return 0; }
相关文章推荐
- LeetCode Majority Element II(Moore Voting Algorithm即Majority Voting Algorithm)
- [Django入门知识浅介]第一个Django程序:Hello World
- 解决chrome下用google搜索图片第二页以后不显示的问题(转)
- django model filter distinct
- LSGO软件技术团队2015~2016学年第四周(0921~0927)总结
- 使用django表单,使网页添加上传文件,并分析文件。
- poj2007 Scrambled Polygon (叉积极角排序)
- sublime text 3中配置golang开发环境
- [Django入门知识浅介]先了解一下Django的历史
- [Django入门知识浅介]Django框架里的MVC思想
- golang笔记:cookie
- Ubuntu 调用 logo_gen.py 转换 log.png
- Go之继承的实现
- MongoEngine中文参考
- Algorithms—278.First Bad Version
- Go之单元测试
- HDU 2672 god is a girl
- Google System File 详解
- Google Chart API学习(三)
- HDU 1824 Let's go home 2-sat基础