19浙复上机

文章包含了三个编程问题的解决方案:1)检查一个数组是否构成大根堆或小根堆;2)计算斐波那契数列的指定项;3)使用C++和map容器找到一组数据中的众数。
摘要由CSDN通过智能技术生成

1.Heaps

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;

int a[1010];

bool maxHeap(int* a, int m) {
   for(int i=1; i<=m/2; i++) {	// 遍历所有非叶子节点 
   	// 如果左右孩子比更大则不是大根堆 
   	if(2*i<=m && a[i] < a[2*i] || 2*i+1<=m && a[i] < a[2*i+1]) return false;
   }
   return true;
} 

bool minHeap(int* a, int m) {
   for(int i=1; i<=m/2; i++) {
   	if(2*i<=m && a[i] > a[2*i] || 2*i+1<=m && a[i] > a[2*i+1]) return false;
   }
   return true;
} 

bool first = true;

void postOrder(int u, int m) {
   if(u<=m) {
   	postOrder(u*2, m);
   	postOrder(u*2+1, m);
   	if(!first) printf(" ");
   	first = false;
   	printf("%d", a[u]);
   }
}
int main(){
   int n, m;
   scanf("%d%d", &n, &m);
   while(n--) {
   	for(int i=1; i<=m; i++) {
   		scanf("%d", &a[i]);
   	}
   	if(minHeap(a, m)) {
   		printf("Min Heap\n"); 
   	} else if(maxHeap(a, m)) {
   		printf("Max Heap\n"); 
   	} else {
   		printf("Not Heap\n");
   	}
   	first = true;
   	postOrder(1, m);
   	printf("\n"); 
   }

   return 0;
}

2.铺地砖

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 10000 + 10;
int f[maxn];
int main(){
	int n;
	scanf("%d", &n);
	f[1] = 1, f[2] = 2;
	for(int i=3; i<=n; i++) {
		f[i] = f[i-1] + f[i-2];
		f[i] %= 999983;
	}
	printf("%d\n", f[n]);
	return 0;
}

3.求众数

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
int main(){
	int n;
	map<int, int> m;
	while(scanf("%d", &n)==1) {						// 处理多组数据 
		m.clear();							// map容器,key为数据,value对于出现的次数 
		int x;
		for(int i=0; i<n; i++) {					// 输入n个数字 
			scanf("%d", &x);
			if(m.find(x)!=m.end()) m[x] = 0;		// 如果x第一次出现,需要做初始化 
			m[x]++;									// x出现次数加一 
		}
		int maxcnt = 0;	// 最多出现次数 
		int ans = 0;	// 对于的数据 
		for(map<int, int>::iterator it =  m.begin(); it != m.end(); it++) {	// 遍历map容器 
//			it->first;	// key,即数据
//			it->second;	// value,即数据出现次数 
			if(it->second > maxcnt || (it->second==maxcnt && it->first < ans)) {		// 遇到一个更优解 
				maxcnt = it->second;		// 更新
				ans = it->first; 
			}
		}
		printf("%d\n", ans);	// 输出 
	} 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值