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来判断最小值和次最小值是否相等