套题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,0001≤A,B,C,D≤10,000
清北学堂 NOIP2016 系列模拟题三
T1
#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;
}
代码1

要注意的问题:

  先同乘以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,0001≤x,y≤n,1≤z≤10,000
T2
#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;
}
代码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
T3
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
代码

 




posted @ 2017-08-15 21:11  浪矢-CL  阅读(198)  评论(0编辑  收藏  举报