文章
18
粉丝
0
获赞
76
访问
3.2k
#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);
 ...
登录后发布评论
暂无评论,来抢沙发