积木问题

(赛码网的模拟考试题,这道题目挺有意思)

搭积木

时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB

题目描述:

一天,小明买了许多积木回家,他想把这些积木拼接在一起。每块积木有两个接口,每个接口我们用一个数字标记,规定只有当两块积木有相同数字标记的接口时,这两块积木才可以通过该接口拼接在一起。举例,有两块积木,接口数字分别为1,2和3,4,那么这两块积木无法拼接;若两块积木接口数字分别为1,2和2,3,那么这两块积木可以通过由数字2标记的接口拼接在一起。现在小明知道所有积木的数量和每块积木接口的数字标记,你能告诉他他可以将所有积木拼接成一个整体么?

输入

第一行一个整数t,表示测试数组组数1≤t≤10;
接下来在每组测试数据中:
第一行一个整数n,表示积木的数量1≤n≤100000,
下面n行每行2个整数x,y,表示其中一块积木的两个接口的数字标记;1≤x,y≤100000;

输出

对于每组测试数据,输出”YES”,表示该组数据中的所有积木可以拼接成一个整体,”NO”表示不行。(注意输出不包括引号)

样例输入

2
3
1 2
2 3
4 5
6
1 2
2 3
3 5
4 5
4 6
5 1

样例输出

NO
YES

Hint

在第一组测试数据中,有3块积木,显然前两块是可以拼接在一起的,但是第3块无论如何也无法和前两块拼接,所以输出NO;第二组数据中我们可以这样拼接:5-1-1-2-2-3-3-5-5-4-4-6,因此输出YES。

思路:

先将每个积木的键值对用multimap排序(先都存起来的原因是积木可能乱序,为了排序.注意multimap插入时让小的标号在前面,因为multimap只针对键值排序),然后从头向尾处理,若可以连接,就更新尾端(由于两端均可能更新,故用deque维护).如果遇到和deque中两端数字均不同的积木,即不可链接.否则如果走完全部积木,即为可链接.

代码:

 1 /*搭积木
 2 时间限制:C/C++语言 1000MS;其他语言 3000MS
 3 内存限制:C/C++语言 65536KB;其他语言 589824KB
 4 题目描述:
 5 一天,小明买了许多积木回家,他想把这些积木拼接在一起。每块积木有两个接口,每个接口我们用一个数字标记,规定只有当两块积木有相同数字标记的接口时,这两块积木才可以通过该接口拼接在一起。举例,有两块积木,接口数字分别为1,2和3,4,那么这两块积木无法拼接;若两块积木接口数字分别为1,2和2,3,那么这两块积木可以通过由数字2标记的接口拼接在一起。
 6 现在小明知道所有积木的数量和每块积木接口的数字标记,你能告诉他他可以将所有积木拼接成一个整体么?
 7 输入
 8 第一行一个整数t,表示测试数组组数1≤t≤10;
 9 接下来在每组测试数据中:
10 第一行一个整数n,表示积木的数量1≤n≤100000,
11 下面n行每行2个整数x,y,表示其中一块积木的两个接口的数字标记;1≤x,y≤100000;
12 输出
13 对于每组测试数据,输出”YES”,表示该组数据中的所有积木可以拼接成一个整体,”NO”表示不行。(注意输出不包括引号)
14 样例输入
15 2
16 3
17 1 2
18 2 3
19 4 5
20 6
21 1 2
22 2 3
23 3 5
24 4 5
25 4 6
26 5 1
27 样例输出
28 NO
29 YES
30
31 Hint
32 在第一组测试数据中,有3块积木,显然前两块是可以拼接在一起的,但是第3块无论如何也无法和前两块拼接,所以输出NO;第二组数据中我们可以这样拼接:5-1-1-2-2-3-3-5-5-4-4-6,因此输出YES。
33 */
34
35 //思路:先将每个积木的键值对用multimap排序(先都存起来的原因是积木可能乱序,为了排序.注意multimap插入时让小的标号在前面,因为multimap只针对键值排序),然后从头向尾处理,若可以连接,就更新尾端(由于两端均可能更新,故用deque维护)
36 #include <iostream>
37 #include <map>
38 #include <deque>
39 #include <string>
40
41 using namespace std;
42
43 int main() {
44     int group;
45     cin >> group;
46     while (group--) {
47         string result = "YES";
48         int n;
49         cin >> n;
50         multimap<int, int> mymap;
51         int tmp1, tmp2;
52         while (n--) {
53             cin >> tmp1 >> tmp2;
54             if (tmp1 <= tmp2)
55                 mymap.insert(pair<int, int>(tmp1, tmp2));
56             else
57                 mymap.insert(pair<int, int>(tmp2, tmp1));
58         }
59         deque<int> judge;
60         multimap<int, int>::iterator it = mymap.begin();
61         judge.push_back((*it).first);
62         judge.push_back((*it).second);
63         ++it;
64         for (; it != mymap.end(); ++it) {
65             // cout << "judge.size()=" << judge.size() << endl;
66             // cout << "judge[0]=" << judge[0] << "judge[1]=" << judge[1] << endl;
67             if (judge[0] == (*it).first) {
68                 judge.pop_front();
69                 judge.push_front((*it).second);
70             }
71             else if (judge[1] == (*it).first) {
72                 judge.pop_back();
73                 judge.push_back((*it).second);
74             }
75             else if (judge[0] == (*it).second) {
76                 judge.pop_front();
77                 judge.push_front((*it).first);
78             }
79             else if (judge[1] == (*it).second) {
80                 judge.pop_back();
81                 judge.push_back((*it).first);
82             }
83             else {
84                 result = "NO";
85                 break;
86             }
87         }
88         result = (result == "NO") ? "NO" : "YES";
89         cout << result << endl;
90     }
91     return 0;
92 }
时间: 2024-12-17 13:30:56

积木问题的相关文章

UC前端‘搭积木’的模块化开发——scrat.js

模块化开发 将模块所需的js\css\img\tmpl维护在一起,一个模块一个目录 js渲染模板 css只关心模块内样式 开发团队心声:"我们希望每次研发新产品不是从零开始,不同团队不同项目之间能有可复用的模块沉淀下来." 模块生态 每个工程有_工程模块_和_生态模块_. 生态模块:基于_component规范_开发,部署到Github上,可以通过命令行工具将Github上的模块安装到工程中使用.比如:jQuery, iscroll, zepto.js, vue.js 安装命令: sc

LA 4636 积木艺术

https://vjudge.net/problem/UVALive-4636 题意: 给出正视图和侧视图,判断最少要用多少个立方体. 思路: 首先正视图里出现的积木个数都是必须的,记录下每一列积木的个数出现的次数,接下来看侧视图,如果侧视图某一列积木个数在主视图里找不到,那么就要额外的加上这一列积木数. 1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 using namespace st

p1440积木大赛[noip2013]

题目: 春春幼儿园举办了一年一度的"积木大赛".今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1且高度不定的积木组成,第i块积木的最终高度需要是hi.在搭建开始之前,没有任何积木(可以看成n块高度为 0 的积木).接下来每次操作,小朋友们可以选择一段连续区间[L, R],然后将第L块到第R块之间(含第L块和第R块)所有积木的高度分别增加1.小M是个聪明的小朋友,她很快想出了建造大厦的最佳策略,使得建造所需的操作次数最少.但她不是一个勤于动手的孩子,所以想请你帮忙实现这

AC日记——积木大赛 洛谷 P1969

题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成n块高度为 0 的积木).接下来每次操作,小朋友们可以选择一段连续区间[l, r],然后将第第 L 块到第 R 块之间(含第 L 块和第 R 块)所有积木的高度分别增加1. 小 M 是个聪明的小朋友,她很快想出了建造大厦的最佳策略,使得建造所需的操作次数最少.但她不是一个勤于动手的孩子,所以想请你帮

积木大赛

题目描述 春春幼儿园举办了一年一度的"积木大赛".今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成n块高度为 0 的积木).接下来每次操作,小朋友们可以选择一段连续区间[l, r],然后将第第 L 块到第 R 块之间(含第 L 块和第 R 块)所有积木的高度分别增加1. 小 M 是个聪明的小朋友,她很快想出了建造大厦的最佳策略,使得建造所需的操作次数最少.但她不是一个勤于动手的孩子,所

GDUT 积木积水(栈)

题意 Description 现有一堆边长为1的已经放置好的积木,小明(对的,你没看错,的确是陪伴我们成长的那个小明)想知道当下雨天来时会有多少积水.小明又是如此地喜欢二次元,于是他把这个三维的现实问题简化成二维的问题.设雨量无穷.积木不透水.积木间无缝连接,问在这个二次元的世界里,已放置好的积木会有多少单位的积水量? Input 第一行包含一个整数T(T≤100),表示接下来的测试样例个数. 每个测试样例有两行组成: 第一行包含一个整数N(N≤1e6),表示积木的列数: 第二行包含N个整数Ai

NOIP2010-普及组复赛模拟试题-第二题-数字积木

题目描述 Description 小明有一款新式积木,每个积木上都有一个数,一天小明突发奇想,要是把所有的积木排成一排,所形成的数目最大是多少呢?你的任务就是读入 n 个数字积木,求出所能形成的最大数. 输入输出格式 Input/output 输入格式: 第一行是一个整数 n (n≤1000),接下来 n 行每行是一个正整数. 输出格式:所能形成的最大整数 输入输出样例 Sample input/output 样例测试点#1 输入样例: 313131343 输出样例: 34313131 说明 d

Javascript异步编程之三Promise: 像堆积木一样组织你的异步流程

这篇有点长,不过干货挺多,既分析promise的原理,也包含一些最佳实践,亮点在最后:) 还记得上一节讲回调函数的时候,第一件事就提到了异步函数不能用return返回值,其原因就是在return语句执行的时候异步代码还没有执行完毕,所以return的值不是期望的运算结果. Promise却恰恰要回过头来重新利用这个return语句,只不过不是返回最终运算值,而是返回一个对象,promise对象,用它来帮你进行异步流程管理. 先举个例子帮助理解.Promise对象可以想象成是工厂生产线上的一个工人

codevs 1255 搭积木 x

1255 搭积木 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 一种积木搭建方式,高为H的积木,最底层有M个积木,每一层的积木数是他的低一层的积木数+1或-1.总共有N个积木.(且每行积木数不超过10) 比如下图N=13 H=6 M=2. 输入描述 Input Description 第一行为三个整数.N.H.M. 第二行以后每行一个整数K,-1为结束符. 输出描述 Output Description 第一行为满足N.H

贪心 NOIP2013 积木大赛

积木大赛 题目描述 春春幼儿园举办了一年一度的"积木大赛".今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成n块高度为 0 的积木).接下来每次操作,小朋友们可以选择一段连续区间[l, r],然后将第第 L 块到第 R 块之间(含第 L 块和第 R 块)所有积木的高度分别增加1. 小 M 是个聪明的小朋友,她很快想出了建造大厦的最佳策略,使得建造所需的操作次数最少.但她不是一个勤于动手