很有意思和新意的题目
我们上来肯定是一脸懵逼的,所以我们从一个简单的case开始。如测试数据:
9
8 4 2 5 3 9 1 6 7
8肯定是先来的,我们开通第一个队列:
8
然后4来了,我们可以使用上一个队列:
8 -> 4
然后是2,同理:
8 -> 4 -> 2
然后是5,注意,我们不得不开第二队列:8 -》4
8 -> 4 -> 2
5
然后是3
8-> 4 -> 2
5-> 3
然后是9,不得不开一个新的
8 ->4 -> 2
5-> 3
9
下一个是1,最优的解显然是在2后面(*原则:选择最小的合法解)
8 ->4 -> 2 -> 1
5-> 3
9
然后是6,根据原则
8 ->4 -> 2 -> 1
5-> 3
9-> 6
然后是7,不得不开一个队列
8 ->4 -> 2 -> 1
5-> 3
9-> 6
7
注意到,按照原则这样去排,各个队列最后一辆车是递增顺序。由数据规模,可以2分。又必须前一辆车大于后一辆车,那么考虑upper_bound,考虑到upper_bound可能越界,所以最后一个数我们填上一个巨大的数如0x3f3f3f3f。
#include "cstdio"
#include "algorithm"
using namespace std;
int que[100000];
int siz = 0;
int find(int val){
int p = -1;
int *pos = upper_bound(que, que + siz, val);
if(*pos != 0x3f3f3f3f) p = pos - que;
return p;
}
int main(){
int n;
que[siz] = 0x3f3f3f3f;
scanf("%d", &n);
for(int i = 0; i <n; ++i){
int temp;
scanf("%d", &temp);
int pos = find(temp);
if(pos == -1){
que[siz++] = temp;
que[siz] = 0x3f3f3f3f;
}
else que[pos] = temp;
}
printf("%d", siz);
}