汕头市队赛 SRM 07 A 你的麻将会排序吗
Posted 友人A
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汕头市队赛 SRM 07 A 你的麻将会排序吗相关的知识,希望对你有一定的参考价值。
A 你的麻将会排序吗 SRM 07
曾经有过一些沉迷日麻的小孩纸,后来呀,他们都去寻找自己的世界了。
kpm也是这样的小孩纸。他想有一只自动整理牌的机器。当麻将以给定的顺序进入机器时,通过机器的运转,使得麻将们出机器的顺序是递增的。所以kpm需要在机器中建立一些传送带 (假设这些传送带都是足够长,可以停放很多很多的麻将),问题是,现在kpm需要建立多少条传送带才能完成他的机器。
kpm大概有10^5块麻将吧。
输入格式
第一行是一个不大于10^5的数,表述麻将的总数。
第二行是麻将依次进入机器的编号,ai表示编号为ai的麻将在i时刻进入机器,保证是一个1-n的排列。
输入格式
一个数字,表示这个机器最少需要建几条传送带。
样例输入
9 8 4 2 5 3 9 1 6 7
样例输出
4
这道题其实很容易看出来是求有多少个下降序列(不重复)
就像很多人写过的导弹拦截一样 我们可以贪心
每个数x我们都可以找已知的序列中每个序列最末也就是最小的数和x比较 比x大的都符合条件
不过由贪心可得越接近x越好 所以我们的目标其实是找到比x大中最小的
然后我们发现 我们维护的序列具有单调性
比如我们每次找到一个数 x
若序列中没有符合的 那么我们会新开一个序列 而这个序列的末端就是x 一定比前面所有的序列末端都大
若找到了j个符合的n-j——n,那么n-j就是我们要找的最优解 此时x比1-n-j的末端都大 比n-j——n的末端都小 此时用x替换n-j的末端
容易证明序列仍然单调 那么我们就可以继续二分了
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define LL long long using namespace std; const int M=1e5+7; int read(){ int ans=0,f=1,c=getchar(); while(c<‘0‘||c>‘9‘){if(c==‘-‘) f=-1; c=getchar();} while(c>=‘0‘&&c<=‘9‘){ans=ans*10+(c-‘0‘); c=getchar();} return ans*f; } int n,w[M],cnt,k; int find(int k){ int l=1,r=cnt; while(l<=r){ int mid=(l+r)>>1; if(w[mid]<k) l=mid+1; else r=mid-1; } return l; } int main() { n=read(); w[++cnt]=read(); for(int i=2;i<=n;i++){ k=read(); int s=find(k); if(s>cnt) w[++cnt]=k; else w[s]=k; } printf("%d\n",cnt); return 0; }
以上是关于汕头市队赛 SRM 07 A 你的麻将会排序吗的主要内容,如果未能解决你的问题,请参考以下文章