【hihocoder1255 Mysterious Antiques in Sackler Museum】构造 枚举

简介: 2015北京区域赛现场赛第2题。 题面:http://media.hihocoder.com/contests/icpcbeijing2015/problems.pdf OJ链接:http://hihocoder.com/problemset/problem/1255 题意:给4个矩形的宽和高,问能否选出3个拼成一个大矩形。

2015北京区域赛现场赛第2题。

题面:http://media.hihocoder.com/contests/icpcbeijing2015/problems.pdf

OJ链接:http://hihocoder.com/problemset/problem/1255

题意:给4个矩形的宽和高,问能否选出3个拼成一个大矩形。

解法:可以称之为构造、暴力、枚举、搜索

当时场上写了个很无脑的版本,变量a,b,c一个个枚举,没有可扩展性。

其实稍加分析,把判断和枚举的两个模块独立开来:

  1. 判断的过程每次都只针对一个由3*2个数构成的序列,实现比较直观,只有两种构造方法,见代码;

  2. 一共有(4!) * (2^3)个不同的序列,所以枚举的过程可转化为两个独立的子问题:求4个数的全排列和3个二值量所有取值向量。

  全排列可借助next_permutation方便地得到。k个二值量的所有取值向量可以通过[0,2^k]的整数的二进制表示得到。

  由于是二值量,直接先swap再交换回来即可。注意swap传引用。

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 struct Rec{
 6     int w, h;
 7     Rec& operator = (Rec& r){
 8         w = r.w;
 9         h = r.h;
10         return *this;
11     }
12 }rec[4];
13 
14 int n;
15 int index[4];
16 
17 void swap(Rec& r){ //注意传引用 
18     int temp = r.w;
19     r.w = r.h;
20     r.h = temp;
21 }
22 
23 void reverse(int x){
24     for(int i=0; i<3; i++){
25         if(x&1){
26             swap(rec[index[i]]);
27         }
28         x >>= 1;
29     }
30 }
31 
32 
33 bool judge(){    
34     int ans = false;
35     
36     if(rec[index[0]].w == rec[index[1]].w 
37         && rec[index[1]].w == rec[index[2]].w )
38         ans = true;
39     else if(rec[index[1]].w == rec[index[2]].w 
40         && rec[index[0]].h == rec[index[1]].h + rec[index[2]].h) 
41         ans = true;
42         
43     return ans;
44 }
45 
46 int main()
47 {
48     scanf("%d", &n);
49     while(n--){
50         for(int i=0; i<4; i++){
51             scanf("%d%d", &rec[i].w, &rec[i].h);
52             index[i] = i;
53         }
54         int flag = 0;
55         do{
56             for(int i=0; i<8; i++){
57                 reverse(i);
58                 if(judge()){
59                     flag = 1;
60                     break;
61                 }
62                 reverse(i);    
63             }
64             if(flag) break;
65         }while(next_permutation(index, index+4));
66         printf("%s\n", flag ? "Yes" : "No");
67     }
68     return 0;
69 }

 

目录
相关文章
|
2天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
13天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1286 5
|
12天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1318 87
|
1天前
|
弹性计算 安全 数据安全/隐私保护
2025年阿里云域名备案流程(新手图文详细流程)
本文图文详解阿里云账号注册、服务器租赁、域名购买及备案全流程,涵盖企业实名认证、信息模板创建、域名备案提交与管局审核等关键步骤,助您快速完成网站上线前的准备工作。
175 82
2025年阿里云域名备案流程(新手图文详细流程)
|
1天前
|
自然语言处理 前端开发
基于Electron38+Vite7.1+Vue3+Pinia3+ElementPlus电脑端admin后台管理模板
基于最新版跨平台框架Electron38整合Vite7+Vue3+ElementPlus搭建轻量级客户端中后台管理系统解决方案。
152 86