计算机
一.比较奇偶数个数
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;
}