2010年北邮网研院复试上机题目

2010.网研.Problem A.查找

链接: 牛客网 - 查找

输入
输入数组长度 n
输入数组 a[1…n]
输入查找个数m
输入查找数字b[1…m]

输出
输出 YES or NO 查找有则 YES 否则 NO

样例输入:

5(数组长度)
1 5 2 4 3(数组)
3(查找个数)
2 5 6(查找具体数字)

样例输出
YES
YES
NO

参考代码

#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1000;
int num[maxn];

int main()
{
    int n, m;
    cin >> n;
    for( int i = 0; i < n; i++ )
        cin >> num[i];
    cin >> m;
    sort( num, num+n );
    int sch;
    int low, high, mid;
    while( m-- )
    {
        cin >> sch;
        bool flag = false;
        low = 0;
        high = n-1;
        while( low <= high )
        {
            mid = (low+high)/2;
            if( num[mid] == sch )
            {
                cout << "YES" << endl;
                flag = true;
                break;
            }
            else if( num[mid] a< sch )
                low = mid+1;
            else
                high = mid-1;
        }
        if( !flag )
            cout << "NO" << endl;
    }
    return 0;
}
2010.网研.Problem B.查找第K小数

链接: 牛客网 - 查找第K小数

题意
查找一个数组的第K 小的数,注意同样大小算一样大
如 2 1 3 4 5 2 第三小数为 3
样例输入:
6(数组长度 n)
2 1 3 5 2 2(数组)
3(K 即为第三小数)
样例输出:
3

参考代码

/*
两个同样大的数算一样大 排序需要去重
此题最多为1000个数 直接用STL Set解决 驱动去重排序 时间复杂度O(nlogn)
*/

#include <iostream>
#include <set>

using namespace std;
set<int> S;
int main()
{
    int n, num;
    cin >> n;
    while( n-- )
    {
        cin >> num;
        S.insert( num );
    }
    int k;
    cin >> k;
    k--;
    set<int>::iterator it = S.begin();
    while( k-- )
        it++;
    cout << *it << endl;
}
2010.网研.Problem C.打牌

链接: 牛客网 - 打牌

题目描述
牌只有 1 到 9,手里拿着已经排好序的牌 a,对方出牌 b,用程序判断手中牌是否能够压过对方出牌
规则:出牌牌型有 5 种
[1]一张 如 4 则 5…9 可压过
[2]两张 如 44 则 55,66,77,…,99 可压过
[3]三张 如 444 规则如[2]
[4]四张 如 4444 规则如[2]
[5]五张 牌型只有 12345 23456 34567 45678 56789 五个,后面的比前面的均大压过输出YES 否则NO

样例输入:
12233445566677(手中牌)
33(出牌)

样例输出:
YES

参考代码

#include <iostream>
#include <string>
using namespace std;
int maxn = 50;

int main()
{
    string myCard, yourCard;
    cin >> myCard;
    int cnt[10] = {0};
    int num = myCard.size();
    for( int i = 0; i < num; i++ )
        cnt[ myCard[i]-'0' ]++;

    int five[10] = {0};
    for( int i = 1; i < 10; i++ )
        if( cnt[i] && cnt[i-1] )
            five[i] = five[i-1]+1;
        else if( cnt[i] )
            five[i] = 1;
        else
            five[i] = 0;

    cin >> yourCard;
    int type = yourCard.size();
    int c1 = yourCard[0]-'0';
    int c5;
    if( type == 5 )
        c5 = yourCard[4]-'0';

    bool flag = false;
    if( type <= 4 )
        for( int i = c1+1; i < 10; i++ )
        {
            if( cnt[i] >= type )
            {
                flag = true;
                break;
            }
        }
    else
        for( int j = c5+1; j < 10; j++ )
            if( five[j] >= 5 )
            {
                flag = true;
                break;
            }

    if( flag )
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
    return 0;
}
2010.网研.Problem D.树 查找

链接: 牛客网 - 树 查找

题目描述
有一棵树,输出某一深度的所有节点,有则输出这些节点,无则输出EMPTY。该树是完全二叉树。
输入描述:
输入有多组数据。
每组输入一个n(1<=n<=1000),然后将树中的这n个节点依次输入,再输入一个d代表深度。
输出描述:
输出该树中第d层得所有节点,节点间用空格隔开,最后一个节点后没有空格。
示例1
输入
4
1 2 3 4
2
输出
2 3
参考代码

/* 完全二叉树 高度为h的节点 编号为 [2^(h-1)   2^h-1];*/
#include <iostream>
#include <cmath>
using namespace std;
const int maxn = 1010;
int A[maxn];
int main()
{
    int n, m;
    cin >> n;
    for( int i = 1; i <= n; i++ )
        cin >> A[i];
    cin >> m;
    int l = (int)pow( double(2), double(m-1) );
    int r = (int)pow( double(2), double(m) );
    bool firstCase = true;
    bool flag = false;
    for( int i = l; i <= n && i < r; i++ )
    {
        flag = true;
        if( firstCase )
            firstCase = false;
        else
            cout << " ";
        cout << A[i];
    }
    if( !flag )
        cout << "EMPTY" << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值