北京邮电大学2010年网院方向复试上机题 解题报告

初试悲催折戟 不过某种意义上也不是太坏的事 反正我不急着工作 这一年多A些机试题 对于我这个转专业到CS的编程经验极度匮乏的人来说也不乏裨益

这几天为了找专业课的上课地点 疲于奔命 周末难得清闲 先A了一套北邮的题 朋友赫阳今年初试分数很高 祝福他拿下北邮吧!也希望这些解题报告能对他有微薄的帮助

九度OJ 题目1173:查找
题目描述:
        输入数组长度 n
        输入数组      a[1...n]
        输入查找个数m
        输入查找数字b[1...m]
        输出 YES or NO  查找有则YES 否则NO 。
输入:
        输入有多组数据。
        每组输入n,然后输入n个整数,再输入m,然后再输入m个整数(1<=m<=n<=100)。
输出:
        如果在n个数组中输出YES否则输出NO。
样例输入:
        5
        1 5 2 4 3
        3
        2 5 6
样例输出:
        YES
        YES
        NO


//北邮2010网院:题目1173:查找 
#include <fstream>
#include <memory.h>
#include <algorithm>
#include <iostream>
using namespace std;
int a[100], b[100];

int searchA( int x, int low, int high, int a[], bool &found ){
	int mid;
	found = 0;
	while( low <= high ){
		mid = (low+high)/2;
		if( x == a[mid] ){
			found = 1;
			return mid;
		}
		else if( x < a[mid] )
			high = mid - 1;
		else low = mid + 1;
	}
	return -1;
};

int main()
{
	int i, j, k, n, m;
	int remain, result;
	bool found;
	ifstream cin("BUPT_1173.txt");//
	while( cin >> n ){
		for( i=0; i<n; i++ )
			cin >> a[i];
		cin >> m;
		for( i=0; i<m; i++ )
			cin >> b[i];
		sort(a,a+n);
		for( i=0; i<m; i++ ){
			result = searchA( b[i], 0, n-1, a, found );
			//cout << "i=" << i << " mid=" << result << " " << found << endl;
			if( result == -1 )
				cout << "NO\n";
			else cout << "YES\n";
		}
	}
	system("pause");
	return 0;
}

九度OJ 题目1174:查找第K小数
题目描述:
        查找一个数组的第K小的数,注意同样大小算一样大。
        如  2 1 3 4 5 2 第三小数为3。
输入:
        输入有多组数据。
        每组输入n,然后输入n个整数(1<=n<=1000),再输入k。
 输出:
        输出第k小的整数。
样例输入:
        6
        2 1 3 5 2 2
        3
样例输出:
        3

#include <fstream>
#include <memory.h>
#include <algorithm>
#include <iostream>
using namespace std;
int a[1000], b[1000];

int main()
{
	int i, j, k, n, m;
	int remain, result;
	bool found;
	ifstream cin("BUPT_1174.txt");//
	while( cin >> n ){
		for( i=0; i<n; i++ )
			cin >> a[i];
		cin >> k;
		sort(a,a+n);
		b[0] = a[0];
		for( i=1,j=0; i<n; i++ )
			if( a[i] != b[j] ){
				j++;
				b[j] = a[i];
			}
		//for( i=0; i<=j; i++ )
		//	cout << b[i] << " ";
		cout << b[k-1] << endl;
	}
	system("pause");
	return 0;
}

九度OJ 题目1175:打牌
题目描述:
    牌只有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五个,后面的比前面的均大。
输入:
    输入有多组数据。
    每组输入两个字符串(字符串大小不超过100)a,b。a字符串代表手中牌,b字符串代表处的牌。
输出:
    压过输出YES 否则NO。
样例输入:
    12233445566677
    33
样例输出:
    YES

//北邮2010网院:题目1175:打牌
#include <fstream>
#include <memory.h>
#include <algorithm>
#include <string>
#include <cstring>
#include <iostream>
using namespace std;
int a[1000], b[1000];
int card[10];	//card[0]舍弃

int main()
{
	int i, j, k, n, m;
	string s, t;
	int slen, tlen;
	ifstream cin("BUPT_1175.txt");//
	while( cin >> s ){
		memset(card,0,sizeof(card));
		slen = s.length();
		for( i=0; i<slen; i++ )
			card[s[i]-48]++;
		//for( i=1; i<=9; i++ )//
		//	cout << card[i] << " ";//
		cin >> t;
		tlen = t.length();

		bool sucess = 0;
		k = t[0]-48;
		if( tlen != 5 ){	//前四种出牌模式
			for( i=k+1; i<=9; i++ )
				if( card[i]>=tlen ){
					cout << "YES" << endl;
					sucess = 1;
					break;
				}
			if( sucess == 0 )
				cout << "NO" << endl; 
		}

		else{	//出牌模式为长线
			int count  = 1;
			if( k == 5 ){
				cout << "NO" << endl;
				//continue;
			}
			else{
				for( i=k+1; i<=5; i++ ){	//5是最后一个线的起点
					for( j=i; j<=i+4; j++ )
						count *= card[j];
					if( count != 0 ){
						cout << "YES" << endl;
						sucess = 1;
						break;
					}
				}
				if( sucess == 0 )
					cout << "NO" << endl; 
			}// else
		}

	}
	system("pause");
	return 0;
}

九度OJ 题目1176:树查找
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:215
解决:85
题目描述:
        有一棵树,输出某一深度的所有节点,有则输出这些节点,无则输出EMPTY。该树是完全二叉树。
输入:
        输入有多组数据。
        每组输入一个n(1<=n<=1000),然后将树中的这n个节点依次输入,再输入一个d代表深度。
输出:
        输出该树中第d层得所有节点,节点间用空格隔开,最后一个节点后没有空格。
样例输入:
        4
        1 2 3 4
        2
样例输出:
        2 3

//北邮2010网院:题目1176:树查找 
//(1<=n<=1000)
#include <fstream>
#include <iostream>
using namespace std;
int a[1001], b[50];	//b[0]舍弃 b[i]存储第i行首元素下标 b[11]为虚构行首

int main()
{
	int i, j, k, n, m, d;
	//ifstream cin("BUPT_1176.txt");//
	while( cin >> n ){
		for( i=1; i<=n; i++ ){	//舍弃a[0]
			//cin >> a[i];
			a[i] = i;
		}
		cin >> d;
		if( d > 10 ){	//1000个元素是10行
			cout << "EMPTY\n";
			continue;
		}

		b[1] = 1;
		for( i=2; i<=11; i++ ){
			b[i] = b[i-1] * 2;
			//cout << b[i] << endl;	//b[11]=1024
		}

		if( n >= b[d] ){
			if( n < b[d+1] ){
				for( i=b[d]; i<=n-1; i++ )
					cout << a[i] << " ";
				cout << a[n] << endl;
			}
			else{
				for( i=b[d]; i<=b[d+1]-2; i++ )
					cout << a[i] << " ";
				cout << a[b[d+1]-1] << endl;
			}
		}
		else cout << "EMPTY\n";

	}
	system("pause");
	return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值