深信服 长方体的摆放

心已入冬 提交于 2019-12-02 05:38:19

 

链接:https://www.nowcoder.com/questionTerminal/7131601fbf5748df8bf4ed564ce9b07a
来源:牛客网

一个长方体,长宽高分别为x,y,z,都为自然数。

现在要把若干个相同的长方体摆成高为N的一根柱形体。

每层摆1个,如果两种摆法的高度是一样的,则认为这两种摆法等价,所以每层只有三种摆法。

求一共有多少种摆法。

 

输入描述:
第一行为一个数字N,N>=1且N<=100,表示要摆放的高度第二行为长方体的长宽高,x、y、z都为无符号整数,按升序排列。


输出描述:
摆法总数,已知该总数会小于10000000
示例1

输入

10
5 6 7

输出

1

 

备注:
如果没有任何一种摆法可以达成目的,输出0

 

#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
#include<vector>
#include<stack>
using namespace std;
int n,cnt=0;
int a[3];
void dfs(int h)
{
    if(h==n)
    {
        cnt++;
        return ;
    }
    else if(h>n)
        return ;
    else
    {
        for(int i=0;i<3;i++)
        {
            h=h+a[i];
            dfs(h);
            h=h-a[i];
        }
    }
}
int main()
{
     
    cin>>n;
    cin>>a[0]>>a[1]>>a[2];
    dfs(0);
    cout<<cnt<<endl;
    return 0;
}

 

 

 

 

链接:https://www.nowcoder.com/questionTerminal/212c0df2ecaf4d73898a0dfa1a56c3fc
来源:牛客网

一个数字段由首尾两个数字标识,表示一个自然数集合,
比如数字段[beg, end)表示从beg到end之间的所有自然数,
包含beg,但不包含end。

有若干个数字段,这些数字段之间可能有重叠,
怎么把这些数字段合并去重,用最少个数的数字段来表示。

合并前后,整个集合包含的数字不发生变化。

 

输入描述:
第一行为数字N,表示接下来有N个数字段(N<=100000)第二行开始一共有N行,每行两个数字,分别表示一个数字段的beg和end(beg和end为无符号32位整数)


输出描述:
合并去重后形成的数字段集合,按升序排列。
示例1

输入

4 
3 8
3 7
4 6
7 9

输出

3 9
#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
#include<vector>
#include<stack>
using namespace std;
struct node
{
    int x;
    int y;
}p[100005],pp[1000005];
bool cmp(node a,node b)
{
    if(a.x==b.x)
        return a.y>b.y;
    else
        return a.x<b.x;
}
bool cmp1(node a,node b)
{
    return a.x<b.x;
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>p[i].x>>p[i].y;
    sort(p,p+n,cmp);
 
    // cout<<"------sort-----"<<endl;
    // for(int i=0;i<n;i++)
    //     cout<<p[i].x<<' '<<p[i].y<<endl;
 
    int l=p[0].x,r=p[0].y,t=0,flag=0;
    for(int i=1;i<n;i++)
    {
        if(r>=p[i].x&&r>=p[i].y)
            continue;
        else if(r>=p[i].x&&r<p[i].y)
            r=p[i].y;
        else if(r<p[i].x)
        {
            flag=1;
            pp[t].x=l;
            pp[t].y=r;
            l=p[i].x;
            r=p[i].y;
            t++;
        }
    }
    pp[t].x=l;
    pp[t].y=r;
    t++;
    sort(pp,pp+t,cmp1);
    for(int i=0;i<t;i++)
        cout<<pp[i].x<<' '<<pp[i].y<<endl;
    return 0;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!