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();
}
}