zoukankan      html  css  js  c++  java
  • 套题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
    ",ans/m);            
            else
            {
                LL d=gcd(ans,m);
                printf("%lld/%lld
    ",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
    代码




  • 相关阅读:
    poj 1191(棋盘分割)
    poj 1184(聪明的打字员)
    HDU 3593(The most powerful force)
    poj 2449(Remmarguts' Date)
    poj 1837(blance)
    poj 1742(Coins)
    poj 3280(Cheapest Palindrome)
    poj 1077(八数码)
    数组排序1.和求最大值
    当textindent与float相遇
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/7367777.html
Copyright © 2011-2022 走看看