北京邮电大学_2010网院___考研计算机_复试上机

1,查找

题目描述:

输入数组长度 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
 
  
总结:这个没技术含量,下面一个好些,简单多了,牵扯到查找,最好用哈希。
#include<iostream>
using namespace std;

int main(){
	int n,m;
	int i,j;
	int swap,find;
	
	while(cin>>n){
		int num[101] = {0};

		for(i=0;i<n;i++){
			cin>>num[i];
		}
		
		for(i=0;i<n;i++){
			for(j=0;j<n-1-i;j++){
				if(num[j] > num[j+1]){
					swap = num[j];
					num[j] = num[j+1];
					num[j+1] = swap;
				}		
			}
		}
		
		cin>>m;
		for(i=0;i<m;i++){
			cin>>find;

			int mid; 
			int low = 0;
			int head = n-1;
			while(low<=head){
				mid = (low+head)/2;
				if(num[mid] == find){
					break;
				}
				if(num[mid] > find){
					head = mid-1;
				}
				if(num[mid] < find){
					low = mid +1;
				}
			}
			
			if(num[mid] == find){
				cout<<"YES"<<endl;
			}else{
				cout<<"NO"<<endl;
			}
		
		}
	
	}


	return 0;
}
#include<iostream>
using namespace std;

int main(){
	int n,m;
	int i,a;
	int find;
	
	while(cin>>n){
		int num[101] = {0};

		for(i=0;i<n;i++){
			cin>>a;
			num[a] = 1;
		}
		
		cin>>m;
		for(i=0;i<m;i++){
			cin>>find;
			if(num[find] == 1){
				cout<<"YES"<<endl;
			}else{
				cout<<"NO"<<endl;
			}
		}
	}
}

2,查找第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<iostream>
using namespace std;

int main(){
	int n;
	int i,j,k,m;

	while(cin>>n){
		int arr[101000]={0};
		for(i=0;i<n;i++){
			cin>>m; 
			arr[m] = 1;
		}
		cin>>k;
		
		j=1;
		for(i=0;i<101000;i++){
			if(arr[i] == 1){
				if(j == k){
					cout<<i<<endl;
					break;
				}else{
					j++;
				}
			}
		}
		
	}


	return 0;
}

3,打牌

题目描述:

牌只有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
总结:没有ac,不明白为什么,案例都可以通过啊

#include<iostream>
#include<string>
using namespace std;

int main(){
	string a,b;
	int i,j,h;

	while(cin>>a>>b){
		bool flag = false;
		int arr[10]={0};
		for(i=0;i<a.length();i++){
			h = a[i] - '0';
			arr[h]++;
		}

		if(b.length() >= 1 && b.length() <= 4){
			j = b.length();
			h = b[0] - '0';
			for(i=0;i<10;i++){
				if(i>h && arr[i] > j){
					flag = true;
					break;
				}
			}
		}

		if(b.length() == 5){
			int min = b[0] - '0';
			for(i=min+1;i<10;i++){
				for(j=0;j<5;j++){
					if(arr[i+j] == 0){
						break;
					}
					if(j == 4){
						flag = true;
						break;
					}
				}
			}
		}

		if(flag){
			cout<<"YES"<<endl;
		}else{
			cout<<"NO"<<endl;
		}
	}


	return 0;
}

4,树查找

题目描述:

有一棵树,输出某一深度的所有节点,有则输出这些节点,无则输出EMPTY。该树是完全二叉树。

输入:

输入有多组数据。
每组输入一个n(1<=n<=1000),然后将树中的这n个节点依次输入,再输入一个d代表深度。

输出:

输出该树中第d层得所有节点,节点间用空格隔开,最后一个节点后没有空格。

样例输入:
4
1 2 3 4
2
样例输出:
2 3
总结:感觉有些cheat,树查找没有用到树,只是树的一些性质。

#include<iostream>
using namespace std;
#define min_num -1000

int main(){
	int n,m;
	int i,j,k;

	while(cin>>n){
		int arr[1010];
		for(i=0;i<1010;i++){
			arr[i] = min_num;
		}
		for(i=1;i<=n;i++){
			cin>>arr[i];
		}

		cin>>m;
		k=1;
		for(i=1;i < m;i++){
			k*=2;
		}

		j=0;
		for(i=k;i <= k*2-1;i++){
			if(arr[i] != min_num){
				j++;
			}
		}

		if(j==0){
			cout<<"EMPTY"<<endl;
		}else{
			for(i=0;i<j-1;i++){
				cout<<arr[k+i]<<" ";
			}
			cout<<arr[k+j-1]<<endl;
		}
	
	}


	return 0;
}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值