数据结构PTA求最小值和次最小值

PTA数据结构
7-1 求最小值和次小值 (25分)
本题目要求读入n个整数,要求用最少的比较次数,输出它们的最小值和次小值。例如,对于12 13 1 10 34 1这6个数,最小值为1,次小值

为10。

输入格式:
输入有两行。第一行为整数个数n(≤1 000 000),第二行给出n个以空格分隔的整数。

输出格式:
对每一组输入,在一行中输出最小值和次小值,中间以一个空格分隔,但行尾没有多余空格。如果输入数据不足两个,则输出“Invalid Input”。如果没有次小值,则输出“There is no second smallest element”。

输入样例:
6
12 13 1 10 34 1
输出样例:
1 10

正确代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    if(n<2){
        cout<<"Invalid Input"<<endl;
        return 0;
    }
    int a[n];
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
   sort(a,a+n);
    int min=a[0];
    int nmin,sign=0;
    for(int i=0;i<n;i++){
        if(a[i]>min){
            nmin=a[i];
          sign=1;
            break;
        }
    }
    if(sign==0)
        cout<<"There is no second smallest element"<<endl;
    else
        cout<<min<<" "<<nmin<<endl;
    return 0;
    
}

本题要求比较然后求出他的最小值和次最小值,在数据课本中我们了解到了求他的最大值和次最大值;但是在测试程序时,有测试点未过。
原来的思路是遍历,然后依次的比较,但是那样不对。
换一种思路,我们可以将数组先进行排序,然后输出最小值和次最小值;
要想把数组排序,我们可以用到C++中的sort函数。
sort函数:
I)Sort函数包含在头文件为#include的c++标准库中,调用标准库里的排序方法可以不必知道其内部是如何实现的,只要出现我们想要的结果即可!
II)Sort函数有三个参数:
(1)第一个是要排序的数组的起始地址。
(2)第二个是结束的地址(最后一位要排序的地址)
(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。
Sort函数使用模板:
Sort(start,end,排序方法)
(1)sort函数没有使用第三个参数,默认升序,实现的是从小到大。
(2)从大到小
需要加入一个比较函数 complare(),此函数的实现过程是这样的
bool complare(int a,int b)
{
return a>b;
}
std::ios::sync_with_stdio(false)
std::ios::sync_with_stdio(false) 的作用是baidu取消缓冲区同步,因为printf()/scanf()是C函数zhi,而cin/cout是C++函数,这些函数需要用到各自的缓冲区,为了防dao止各自的缓冲区错位,C++默认将C函数和C++函数的缓冲区同步。当你设置成std::ios::sync_with_stdio(false)后C++就会取消同步,这会提高cin/cout的运行速度,代价是不能和printf()/scanf()混用,否则会因不同步而出现问题,所以在这种情况下整个程序切记不可将cin/cout和printf()/scanf()混用
其可以大幅提高大数据的输入和输出以节省时间
定义了一个sign来判断最小值和次最小值是否相等

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值