练习题(二)

练习题(二)

时间限制: 1 Sec 内存限制: 128 MB
[命题人:171360140]
题目描述
李华从高中来到了大学,高中老师说的到大学就轻松了,他也相信了,他到大学发现老师说的有点道理,不过要想学到更多的知识,都要靠自学。他在学习一段时间后休息的时候看到了一串数字,但这些数字比较乱,所以他就想把这些数字按照自己的思路经行排序,排序规则如下:假设有n个整数,其中3<=n<=10000;删除第2个元素,然后对除第一个元素和最后一个元素外的元素进行去重和按从大到小的顺序排列。
输入
第一行输入一个整数n
第二行输入n个整数
输出
第一行剩余元素的个数
第二行按规则顺序输出元素(两个数之间有一个空格,末尾无空格)
样例输入

8
8 2 3 4 5 6 7 1

样例输出

7
8 7 6 5 4 3 1

来源/分类
寒假练习赛
**题目网址:**http://47.112.31.182/problem.php?id=1066
题意:
先输入一个n,然后输入n个数,先把第二个删掉,然后再除第一个和最后一个外,对中间的数进行去重和排序(从大到小)
**思路:**看到去重和排序,首先想到的是set集合容器,去重排序把第一个和最后一个除外,且把第二个删除,所以可以先把输入两个,第一个用个数存一下,第二个不管,从第3个到倒数第二个存到set集合容器中。因为set默认排序是从小到大,所以要自定义排序。
代码:

#include <iostream>
#include <set>  //集合容器头文件
using namespace std;
struct MyComp   //自定义非结构体函数
{
    bool operator () (const int &a,const int &b)//自定义排序函数()是重载符
    {
        if(a!=b)
            return a>b; //从大到小
        else
            return a>b;
    }
};
int main()
{
    set<int,MyComp> s;  //创建包含自定义排序的集合容器
    int First,End,n,x;
    cin>>n; //输入n,代表n个数
    cin>>First>>x;  //First存第一个元素,x为第二个数直接舍掉
    for(int i=2;i<n-1;i++)  //从第3个到倒数第2个
    {
        cin>>x;
        s.insert(x);    //存到集合容器中自动去重排序
    }
    cin>>End;   //End存最后一个元素
    cout<<s.size()+2<<endl; //剩余元素的个数
    cout<<First;  //第一个元素
    set<int,MyComp>::iterator it;   //定义迭代器
    for(it=s.begin();it!=s.end();it++)  //遍历容器中的元素
        cout<<" "<<*it; 
    cout<<" "<<End<<endl;   //输出最后一个数并换行
    return 0;
}

运行结果:
在这里插入图片描述
总结:
这个题因为n<10000所以如果用冒泡排序很有可能会时间超限,在stl中有set集合容器正好有去重和排序,所以用set还是非常好的,也正好锻炼了一下set的使用

猜你喜欢

转载自blog.csdn.net/qq_41657977/article/details/86701484