2010北邮机试

计算机

一.比较奇偶数个数

5
1 5 2 4 3

#include <bits/stdc++.h>
using namespace std;
int main(){
	int n,num[1000];
	while(scanf("%d",&n)!=EOF){
		int even=0,odd=0;
		for(int i=0;i<n;i++){
			scanf("%d",&num[i]);
			if(num[i]%2==0) even++;
			else odd++;
		}
		puts(even>odd?"NO":"YES");	
	}
	return 0;
}

二.找最小数
在这里插入图片描述
5
3 3
2 2
5 5
2 1
3 6

#include <bits/stdc++.h>
using namespace std;
struct node{
	int x,y;
	bool operator < (const node &a) const{
		if(x!=a.x) return x<a.x;
		else return y<a.y;
	}
}num[1000];
int main(){
	int n;
	while(scanf("%d",&n)!=EOF){
		for(int i=0;i<n;i++)
			scanf("%d%d",&num[i].x,&num[i].y);
		sort(num,num+n);
		printf("%d %d\n",num[0].x,num[0].y);
	}
	return 0;
}

三.c翻转
在这里插入图片描述
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
1 3 1 1

#include <stdio.h>
int m[5][5],tmp[5][5];
int main(){
    for(int i=0;i<5;i++)
        for(int j=0;j<5;j++){
            scanf("%d",&m[i][j]);
            tmp[i][j]=m[i][j];
        }
    int d,c,x,y;
    scanf("%d%d%d%d",&d,&c,&x,&y);
    int sx=x-1,sy=y-1,ex=sx+c-1,ey=sy+c-1;
    for(int i=sx;i<=ex;i++)
		for(int j=sy;j<=ey;j++){
			if(d==1) m[i][j]=tmp[ex-(j-sy)][sy+(i-sx)];
            else m[i][j]=tmp[sx+(j-sy)][ey-(i-sx)];
		}
    for(int i=0;i<5;i++){
		for(int j=0;j<4;j++)
			printf("%d ",m[i][j]);
		printf("%d\n",m[i][4]);
	}
    return 0;
}

四.哈夫曼树
在这里插入图片描述
5
1 2 2 5 9

#include <bits/stdc++.h>
using namespace std;
int num[1000];
priority_queue<int,vector<int>,greater<int> > q;
int hfm(int n){
	int weight=0;
	while(q.size()>1){
		int x=q.top();
		q.pop();
		int y=q.top();
		q.pop();
		weight+=x+y;
		q.push(x+y);
	}
	return weight;
}
int main(){
	int n;
	while(scanf("%d",&n)!=EOF){
		while(!q.empty()) q.pop();
		for(int i=0;i<n;i++){
			int x;
			scanf("%d",&x);
			q.push(x);
		}
			scanf("%d",num[i]);
		printf("%d\n",hfm(n));
	}
	return 0;
}

网研

第一题:查找
输入数组长度 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 <stdio.h>
using namespace std;
int main(){
    int n,num[1000],ser[1000];
    while(scanf("%d",&n)!=EOF){
        for(int i=0;i<n;i++)
        	scanf("%d",&num[i]);
		int m;
		scanf("%d",&m);
		for(int i=0;i<m;i++)
			scanf("%d",&ser[i]);
		for(int i=0;i<m;i++){		
			bool flag=false;
			for(int j=0;j<n;j++){
				if(ser[i]==num[j]){
					flag=true;
					break;
				}
			}
			puts(flag?"YES":"NO");
		}
    }
    return 0;
}

第二题:查找第K小数
查找一个数组的第K小的数,注意同样大小算一样大
如 2 1 3 4 5 2 第三小数为3

如(括号内容为注释)
输入:
6(数组长度n)
2 1 3 5 2 2(数组)
3(K 即为第三小数)

输出:
3

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,i,k;
    while(scanf("%d",&n)!=EOF)
    {
        map<int,int> mmap;
        for(i=0;i<n;++i)
        {
			int tmp; 
			scanf("%d",&tmp);
			mmap[tmp]=1;
        }
        scanf("%d",&k);
        map<int,int>::iterator it=mmap.begin();
        for(;it!=mmap.end()&&k!=1;it++,--k);
			printf("%d\n",it->first);
    }
    return 0;
}

第三题:打牌
牌只有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 <bits/stdc++.h>
using namespace std;
int main(){
    string s,subs;
    int cnt[10];
    while(cin>>s){
        cin>>subs;
        for(int i=1;i<10;i++)
            cnt[i]=0;
        for(int i=0;i<s.size();i++)
            cnt[s[i]-'0']++;
        bool flag=false;
        if(subs.size()<5){
            for(int i=subs[0]+1-'0';i<10;i++)
                if(cnt[i]>=subs.size()){
                    flag=true;
                    break;
                }
        }
        else{
            for(int i=subs[0]+1-'0';i<6;i++)
                if(cnt[i]>=1&&cnt[i+1]>=1&&cnt[i+2]>=1&&cnt[i+3]>=1&&cnt[i+4]>=1&&cnt[i+5]>=1){
                    flag=true;
                    break;
                }
        }
        puts(flag?"YES":"NO");
    }
    return 0;
}

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

#include <stdio.h>
#include <math.h>
using namespace std;
int tree[1001];
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        for(int i=1;i<=n;i++)
            scanf("%d",&tree[i]);
        int d;
        scanf("%d",&d);
        int i=pow(2,d-1);
        if(i>n) printf("EMPTY\n");
        else{
            for(;i<=n&&i<pow(2,d)-1;i++){
                printf("%d ",tree[i]);
            }
            printf("%d\n",tree[(int)pow(2,d)-1]);
        }

    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值