您的位置:首页 > 其它

算法之买帽子(求第三便宜的帽子价格)

2017-07-26 16:36 295 查看

原题

度度熊想去商场买一顶帽子,商场里有N顶帽子,有些帽子的价格可能相同。

度度熊想买一顶价格第三便宜的帽子,问第三便宜的帽子价格是多少?

[b]输入描述:[/b]

首先输入一个正整数N(N <= 50),接下来输入N个数表示每顶帽子的价格(价格均是正整数,且小于等于1000)

[b]输出描述:[/b]

如果存在第三便宜的帽子,请输出这个价格是多少,否则输出-1

[b]测试用例:[/b]

10

10 10 10 10 20 20 30 30 40 40

[b]输出结果:[/b]

30

题解

[b]解题思想:[/b]

采用最大堆的思想,用数组模拟一个元素个数为3的最大堆并赋初始值(初始值须大于题中要求的临界值),堆顶元素(即数组的第一个元素)永远保持为堆中最大,每插入一个元素,首先判断是否跟堆中元素相同,再判断是否比堆顶元素小,若无重复且小于堆顶元素,用其将堆顶元素覆盖,再调用堆调整算法。循环结束后,若数组第一个元素仍为初始值,则输出-1,反之输出数组第一个元素。该时间复杂度为O(N)。类似问题有:top k问题

[b]代码:[/b]

#include <stdio.h>

void compare(int result[]){
if(result[1]>result[0]){
result[1]=result[1]^result[0];
result[0]=result[1]^result[0];
result[1]=result[1]^result[0];
}
if(result[2]>result[0]){
result[2]=result[2]^result[0];
result[0]=result[2]^result[0];
result[2]=result[2]^result[0];
}
}
int main(){
int N;
int price;
int result[3]={1001,1001,1001};
int i;
scanf("%d",&N);
for(i=0;i<N;i++){
scanf("%d",&price);
if(price!=result[0]&&price!=result[1]&&price!=result[2]&&price<result[0]){
result[0]=price;
compare(result);
}
}
if(result[0]==1001){
result[0]=-1;
}
printf("%d",result[0]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法
相关文章推荐