套题1

1.铺瓷砖 (tile.cpp/c/pas) 【问题描述】 有一面很长很长的墙。你需要在这面墙上贴上两行瓷砖。你的手头有两种不同尺寸的瓷 砖,你希望用这两种瓷砖各贴一行。瓷砖的长可以用分数表示,贴在第一行的每块瓷砖长度 为 A B ,贴在第二行的每块瓷砖长度为 C D 。本问题中你并不需要关心瓷砖的宽度。 如上图所示,两排瓷砖从同一起始位置开始向右排列,两排瓷砖的第一块的左端的缝隙 是对齐的。你想要知道,最短铺多少距离后,两排瓷砖的缝隙会再一次对齐。 【输入】 输入的第 1 行包含一个正整数 T,表示测试数据的组数。 接下来 T 行,每行 4 个正整数 A,B,C,D,表示该组测试数据中,两种瓷砖的长度分 别为 A B 和 C D 。 【输出】 输出包含 T 行,第 i 行包含一个分数或整数,表示第 i 组数据的答案。如果答案为分数, 则以“X/Y”的格式输出,不含引号。分数必须化简为最简形式。如果答案为整数,则输出 一个整数 X。 【输入输出样例 1】 tile.in tile.out 2 1 2 1 3 1 2 5 6 1 5/2 【数据规模与约定】 对于 50%的数据,1≤A,B,C,D≤20 对于 70%的数据,T≤10 对于 100%的数据,T≤100,000,1≤A,B,C,D≤10,000 清北学堂 NOIP2016 系列模拟题三

#include<iostream> #include<cstring> #include<algorithm> #include<queue> #include<math.h> #include<cstdio> using namespace std; #define LL long long LL T,A,B,C,D,ans,m; LL gcd(LL a,LL b) { if(b==0) return a; return gcd(b,a%b); } int main() { freopen("tile.in","r",stdin); freopen("tile.out","w",stdout); scanf("%lld",&T); for(int i=1;i<=T;i++) { scanf("%lld%lld%lld%lld",&A,&B,&C,&D); ans=gcd(A*D,B*C);m=B*D; ans=(A*C*m)/ans; if(ans%m==0) printf("%lld\n",ans/m); else { LL d=gcd(ans,m); printf("%lld/%lld\n",ans/d,m/d); } } return 0; }
要注意的问题:
先同乘以B*D 化成整数。
gcd找到最小公倍数。
再除回来B*D。再用GCD找到分子分母的最大公约数,约分

2.小 Y 的问题 (question.cpp/c/pas) 【问题描述】 有个孩子叫小 Y,一天,小 Y 拿到了一个包含 n 个点和 n-1 条边的无向连通图,图中的 点用 1~n 的整数编号。小 Y 突发奇想,想要数出图中有多少个“Y 字形”。 一个“Y 字形”由 5 个不同的顶点 A、B、C、D、E 以及它们之间的 4 条边组成,其中 AB、 BC、BD、DE 之间有边相连,如下图所示。 同时,无向图中的每条边都是有一定长度的。一个“Y 字形”的长度定义为构成它的四条 边的长度和。小 Y 也想知道,图中长度最大的“Y 字形”长度是多少。 【输入】 第一行包含一个整数 n,表示无向图的点数。 接下来 n 行,每行有 3 个整数 x、y、z,表示编号为 x 和 y 的点之间有一条长度为 z 的 边。 【输出】 输出包含 2 行。 第 1 行包含一个整数,表示图中的“Y 字形”的数量。 第 2 行包含一个整数,表示图中长度最大的“Y 字形”的长度。 【输入输出样例 1】 question.in question.out 7 1 3 2 2 3 1 3 5 1 5 4 2 4 6 3 5 7 3 5 9 【数据规模与约定】 对于 30%的数据,n≤10 对于 60%的数据,n≤2,000 对于 100%的数据,n≤200,000,1≤x,y≤n,1≤z≤10,000

#include<iostream> #include<cstring> #include<algorithm> #include<queue> #include<math.h> #include<cstdio> #include<vector> using namespace std; #define M 200009 struct node{ int to,w; }; vector<node>G[M*2]; long long maxn,ans; int n,m1[M][4],t; bool cmp(node x,node y) { return x.w>y.w; } int main() { freopen("question.in","r",stdin); freopen("question.out","w",stdout); scanf("%d",&n); for(int i=1,x,y,z;i<n;i++) { scanf("%d%d%d",&x,&y,&z); G[x].push_back((node){y,z}); if(z>=m1[x][3]) m1[x][3]=z; if(m1[x][3]>m1[x][2]) {t=m1[x][2];m1[x][2]=m1[x][3];m1[x][3]=t;} if(m1[x][2]>m1[x][1]) {t=m1[x][2];m1[x][2]=m1[x][1];m1[x][1]=t;} G[y].push_back((node){x,z}); if(z>=m1[y][3]) m1[y][3]=z; if(m1[y][3]>m1[y][2]) {t=m1[y][2];m1[y][2]=m1[y][3];m1[y][3]=t;} if(m1[y][2]>m1[y][1]) {t=m1[y][2];m1[y][2]=m1[y][1];m1[y][1]=t;} } for(int i=1;i<=n;i++) { long long t=0; if(G[i].size()<3) continue; for(int j=0;j<G[i].size();j++) t+=G[G[i][j].to].size()-1; ans+=1LL*(t*(G[i].size()-1)*(G[i].size()-2)/2); } cout<<ans<<endl; for(int i=1;i<=n;i++) { long long t=0; if(G[i].size()>=2 ) for(int j=0;j<G[i].size();j++) { int to=G[i][j].to; if(G[i][j].w==m1[i][1]) t=m1[i][2]; else t=m1[i][1]; if(G[to].size()<3) continue; if(m1[to][1]==G[i][j].w) t+=m1[to][2]+m1[to][3]; else if(m1[to][2]==G[i][j].w) t+=m1[to][1]+m1[to][3]; else t+=m1[to][1]+m1[to][2]; t+=G[i][j].w; maxn=max(maxn,1LL*t); } } cout<<maxn; return 0; }
方法要对:
第一问:组合数就行了。
第二问:预处理,连边中的最大,次大,此次大值。枚举中间点。

3.水管工的难题 (plumber.cpp/c/pas) 【问题描述】 你是一名优秀的水管工。一天你遇到了一个棘手的难题。你需要在一个长方体状的房间 内连接一条贯穿房间内部的水管。房间的长为 X,宽为 Y,高为 Z,整个房间可以看成是 X×Y×Z 个小立方体空间组成的。如果位房间建立直角坐标系,则房间内每个小立方体空间都可以用 一个三维坐标(x,y,z)表示,房间一角的小立方体的坐标为(1,1,1),它的对角的坐标为(X,Y,Z), 其余小立方体的坐标的三个维度都分别落在 1…X,1…Y 和 1…Z 内。水管的入口和出口已经 开凿好了,它们位于长方体的表面(可能位于房间的地板、墙壁或天花板上),且正好占据 了某个小立方体的一个面。下图展示了房间的立方体空间的划分方式和一种开凿水管出入口 的方式。 你的手头只有一种形状的水管部件,它呈 L 型,且正好占据了 4 个小立方体空间,如下 图所示,灰色部分是水管部件两端的开口位置。 你可以任意旋转、翻转水管部件,然后将它的开口接到入口、出口或者其它水管部件的 开口上。水管的开口必须正好接在入口或出口上才算接上,伸出房间外一截是不行的。下图 展示了一种两个水管部件的连接方式。 在连接水管时,水管部件间不能相交,也不能伸出房间之外。房间内有一些小立方体空 间已经被物品占据了,水管也不能经过那些格子。另外,水管部件数量有限,你的手头只有 12 个这样的零件。 现在,给出房间的长、高、宽,以及入口、出口的位置和房间内物品的坐标,请你计算 清北学堂 NOIP2016 系列模拟题三 至少需要多少个这样的水管部件才能完成任务,或者判断无法完成任务。 【输入】 输入的第 1 行包含 4 个正整数 X,Y,Z,m,其中 X,Y,Z 表示房间的长、高、宽,m 表示 房间中物品的数量。 输入的第 2 行包含 3 个正整数 x 1 ,y 1 ,z 1 ,和一个字符 ch。其中(x 1 ,y 1 ,z 1 )是水管入口所 在的小立方体的坐标。ch 的值为'x'、'y'或'z',用于指示入口所在的面。当 ch 为'x'时,表示 入口所在的面与 YZ 坐标平面平行,当 ch 为'y'时,表示入口所在的面与 XZ 坐标平面平行, 当 ch 为'z'时,表示入口所在的面与 XY 坐标平面平行。输入保证入口所在的面在长方体表面 上。数字和数字、数字和字符间用一个空格隔开。 输入的第 3 行包含 3 个正整数 x 2 ,y 2 ,z 2 ,和一个字符 ch,表示水管出口的位置,意义 与格式同上。 接下来 m 行,每行包含三个正整数 x i ,y i ,z i ,表示在坐标(x i ,y i ,z i )的小立方体空间内有 物品。 【输出】 输出包含 1 个整数,表示最少使用的水管部件的数量。如果不能完成接水管的任务,输 出“impossible”,不含引号。 【输入输出样例 1】 plumber.in plumber.out 5 4 3 1 3 1 1 z 1 4 3 x 2 3 3 2

3.水管工的难题 (plumber.cpp/c/pas) 【问题描述】 你是一名优秀的水管工。一天你遇到了一个棘手的难题。你需要在一个长方体状的房间 内连接一条贯穿房间内部的水管。房间的长为 X,宽为 Y,高为 Z,整个房间可以看成是 X×Y×Z 个小立方体空间组成的。如果位房间建立直角坐标系,则房间内每个小立方体空间都可以用 一个三维坐标(x,y,z)表示,房间一角的小立方体的坐标为(1,1,1),它的对角的坐标为(X,Y,Z), 其余小立方体的坐标的三个维度都分别落在 1…X,1…Y 和 1…Z 内。水管的入口和出口已经 开凿好了,它们位于长方体的表面(可能位于房间的地板、墙壁或天花板上),且正好占据 了某个小立方体的一个面。下图展示了房间的立方体空间的划分方式和一种开凿水管出入口 的方式。 你的手头只有一种形状的水管部件,它呈 L 型,且正好占据了 4 个小立方体空间,如下 图所示,灰色部分是水管部件两端的开口位置。 你可以任意旋转、翻转水管部件,然后将它的开口接到入口、出口或者其它水管部件的 开口上。水管的开口必须正好接在入口或出口上才算接上,伸出房间外一截是不行的。下图 展示了一种两个水管部件的连接方式。 在连接水管时,水管部件间不能相交,也不能伸出房间之外。房间内有一些小立方体空 间已经被物品占据了,水管也不能经过那些格子。另外,水管部件数量有限,你的手头只有 12 个这样的零件。 现在,给出房间的长、高、宽,以及入口、出口的位置和房间内物品的坐标,请你计算 清北学堂 NOIP2016 系列模拟题三 至少需要多少个这样的水管部件才能完成任务,或者判断无法完成任务。 【输入】 输入的第 1 行包含 4 个正整数 X,Y,Z,m,其中 X,Y,Z 表示房间的长、高、宽,m 表示 房间中物品的数量。 输入的第 2 行包含 3 个正整数 x 1 ,y 1 ,z 1 ,和一个字符 ch。其中(x 1 ,y 1 ,z 1 )是水管入口所 在的小立方体的坐标。ch 的值为'x'、'y'或'z',用于指示入口所在的面。当 ch 为'x'时,表示 入口所在的面与 YZ 坐标平面平行,当 ch 为'y'时,表示入口所在的面与 XZ 坐标平面平行, 当 ch 为'z'时,表示入口所在的面与 XY 坐标平面平行。输入保证入口所在的面在长方体表面 上。数字和数字、数字和字符间用一个空格隔开。 输入的第 3 行包含 3 个正整数 x 2 ,y 2 ,z 2 ,和一个字符 ch,表示水管出口的位置,意义 与格式同上。 接下来 m 行,每行包含三个正整数 x i ,y i ,z i ,表示在坐标(x i ,y i ,z i )的小立方体空间内有 物品。 【输出】 输出包含 1 个整数,表示最少使用的水管部件的数量。如果不能完成接水管的任务,输 出“impossible”,不含引号。 【输入输出样例 1】 plumber.in plumber.out 5 4 3 1 3 1 1 z 1 4 3 x 2 3 3 2 见选手目录下的 plumber/plumber1.in 与 plumber/plumber1.out 【输入输出样例 1 说明】 入口和出口的位置如图所示: 【输入输出样例 2】 见选手目录下的 plumber/plumber2.in 与 plumber/plumber2.out 清北学堂 NOIP2016 系列模拟题三 【数据规模与约定】 对于 30%的数据,1≤X,Y,Z≤5 对于 50%的数据,1≤X,Y,Z≤10 对于 70%的数据,1≤X,Y,Z≤15 对于 100%的数据,1≤X,Y,Z≤20
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App