2010--计算机-ABCD(CD)

Problem.A 统计奇偶数个数

题目描述:
第一行输入一个数,为n,第二行输入n个数,这n个数中,如果偶数比奇数多,输出NO,否则输出YES。
输入
5
1 5 2 4 3

输出
YES

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

//奇数偶数统计
int main()
{ 
    int n ;
    cin>>n;
    int x;
    int ji,ou;
    for(int i=0;i<n;i++){
        cin>>x;
        if(x%2==0) ou++;
        else ji++;
    }
    if (ou>ji) cout<<"No"<<endl;
    else cout<<"Yes"<<endl;
    return 0;
}

Problem.B 找最小数

题目描述:
第一行输入一个数n,1 <= n <= 1000,下面输入n行数据,每一行有两个数,分别是x y。输出一组x y,该组数据是所有数据中x最小,且在x相等的情况下y最小的。

示例1:
输入
5
3 3
2 2
5 5
2 1
3 6

输出
2 1

#include <iostream>
using namespace std;

int main()
{ 
    int n ;
    cin>>n;
    int x,y;
    int min_x,min_y;
    for(int i=0;i<n;i++){
    	cin>>x;
		cin>>y;
    	if(i==0) {
		min_x=x,min_y=y;
		}
		else{	
    	if(x<min_x){
		min_x=x,min_y=y;	
		}
		else if(x==min_x){
			if(y<min_y) min_y=y;
		}
	}
    }
	cout<<min_x<<" "<<min_y<<endl;
    return 0;
}

Problem.C C翻转(矩阵旋转)

题目描述:
首先输入一个5 * 5的数组,然后输入一行,这一行有四个数,前两个代表操作类型,后两个数x y代表需操作数据为以x y为左上角的那几个数据。 操作类型有四种:

1 2 表示:90度,顺时针,翻转4个数

1 3 表示:90度,顺时针,翻转9个数

2 2 表示:90度,逆时针,翻转4个数

2 3 表示:90度,逆时针,翻转9个数

示例1:
输入

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

输出
11 6 1 4 5
12 7 2 9 10
13 8 3 14 15
16 17 18 19 20
21 22 23 24 25
 

#include<iostream>
using namespace std;
int main(){
	int a[5][5];
	for(int i=0;i<5;i++){
		for(int j=0;j<5;j++){
			cin>>a[i][j];
		}
	}
	int mode,n,x,y;		//mode:代表旋转模式 	n:旋转元素个数(n=2代表2*2) 
	cin>>mode>>n;
	cin>>x>>y;
	int temp[n][n];		//存储旋转后得到的数组元素 
	if(mode==1){		//顺时针旋转
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				temp[j][i]=a[x-1+n-1-i][y-1+j];
			}
		}
	}else if(mode==2){	//逆时针旋转 
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				temp[n-1-j][i]=a[x-1+i][y-1+j];
			}
		}
	}
	for(int i=0;i<n;i++){		//将变换后得到数组元素赋值给原数组 
		for(int j=0;j<n;j++){
			a[i+x-1][j+y-1]=temp[i][j];
		}
	}
	for(int i=0;i<5;i++){		//输出 
		for(int j=0;j<5;j++){
			cout<<a[i][j]<<" ";
		}
		cout<<endl;
	}
}

//网络版本

#include<stdio.h>
#include<stdlib.h>

int main(){
    int i,j;
    int arr[5][5];
    int tmp[5][5];
    while(1){
    for(i=0;i<5;i++)
        for(j=0;j<5;j++){
            if(scanf("%d",&arr[i][j])==EOF)
                return 0;
            tmp[i][j]=arr[i][j];
        }           
    int op1,op2;
    int x,y;
    int tmp1,tmp2,tmp3;
    if(scanf("%d",&op1)==EOF||scanf("%d",&op2)==EOF||scanf("%d",&x)==EOF||scanf("%d",&y)==EOF)
        return 0;
    if(op1==1&&op2==2)
        for(i=0;i<2;i++)
            for(j=0;j<2;j++)
                arr[x-1+j][y-1+i]=tmp[x-i][y-1+j];
    else if(op1==1&&op2==3)   
        for(i=0;i<3;i++)
            for(j=0;j<3;j++)
                arr[x-1+j][y-1+i]=tmp[x+1-i][y-1+j];
    else if(op1==2&&op2==2)   
        for(i=0;i<2;i++)
            for(j=0;j<2;j++)
                arr[x-j][y-i]=tmp[x-i][y-1+j];
    else if(op1==2&&op2==3)   
        for(i=0;i<3;i++)
            for(j=0;j<3;j++)
                arr[x+1-j][y+1-i]=tmp[x+1-i][y-1+j];
    for(i=0;i<5;i++)
        for(j=0;j<5;j++)
            if(j!=4)
                printf("%d ",arr[i][j]);
            else
                printf("%d\n",arr[i][j]);
    }
    return 0;
}

Problem.D 哈夫曼树(求WPL)

题目描述:
哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和的最小值。

示例1:
输入
5
1 2 2 5 9

输出
37
非叶

#include<iostream>
#include<iostream>
#include<queue>
using namespace std;
int main()
{
    int n,a,b;
    priority_queue<int,vector<int>,greater<int> > minHeap;
    while(cin>>n)
    {
        int temp;
        int res=0;//结果
        for(int i=0;i<n;i++)//输入叶子节点权值
        {
            cin>>temp;
            minHeap.push(temp);
        }
        while(minHeap.size()!=1)
        {
            //输出两个堆顶元素
            a=minHeap.top();
            minHeap.pop();
            b=minHeap.top();
            minHeap.pop();
            //更新res
            res+=a+b;
            //新节点的值插入堆中
            minHeap.push(a+b);
        }
        cout<<res<<endl;
        minHeap.pop();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值