文章

18

粉丝

0

获赞

76

访问

3.2k

头像
巨人排队 题解:
P1677 中南大学机试题
发布于2026年3月19日 11:01
阅读数 48

#include <iostream>
#include <vector>
#include <string>

using namespace std;
const int maxn=100000+5;
//起初的思路:找出几条递减子序列,每次找最长的序列再删除;错误:“每次都挑最长的队伍删”这个策略,在数学上并不一定能保证最后分出的队伍数是最少的,而且时空复杂度都很高。
//转而用贪心的思想,俩个关键
//①追加:当新来的数比数组里所有的数都大时,才追加在最后面。既然比前面所有的都大,追加在最后,当然这个序列始终保持递增!天然的递增序列

//②替换:当新来的数 x 能够插进前面的队伍时,你替换的一定是“第一个大于等于 x 的数”。
int main() {
    int n;
    while(cin>>n){
        int x;
        vector<int> way;
        for(int i=0;i<n;i++){
            cin>>x;
            //用二分查找寻到第一个>=x的位置
            auto it = lower_bound(way.begin(),way.end(),x);//返回一个指针,指向一个位置
            if(it==way.end()){//未找到符合元素,指向末尾,则再开一个新位置
                way.push_back(x);
     ...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发