《PTA练习*补》
作者:互联网
列车调度 (25分):
这题被之前做过的一个列车的题误导了,一直以为是栈的运用,就一直在思考栈的方向,最后挂了..
思路:
因为是递减出去,所以肯定是大的列车出去,所以,对于每个车,要开辟新的位置来存放它,就是后面有比他大的。
因为如果比他大的插入在某个位置后面,那个大的值显然不是队首,不能先出去。
那么,这题就是个nlogn求最长上升子序列的问题。
// Author: levil #include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<string,int> pii; const int N = 5e5+5; const int M = 2e5+5; const LL Mod = 1e9+7; #define rg register #define pi acos(-1) #define INF 1e9 #define CT0 cin.tie(0),cout.tie(0) #define IO ios::sync_with_stdio(false) #define dbg(ax) cout << "now this num is " << ax << endl; namespace FASTIO{ inline LL read(){ LL x = 0,f = 1;char c = getchar(); while(c < '0' || c > '9'){if(c == '-') f = -1;c = getchar();} while(c >= '0' && c <= '9'){x = (x<<1)+(x<<3)+(c^48);c = getchar();} return x*f; } void print(int x){ if(x < 0){x = -x;putchar('-');} if(x > 9) print(x/10); putchar(x%10+'0'); } } using namespace FASTIO; void FRE(){/*freopen("data1.in","r",stdin); freopen("data1.out","w",stdout);*/} int dp[N],a[N]; int main() { int n;n = read(); for(int i = 1;i <= n;++i) a[i] = read(); int len = 0; dp[++len] = a[1]; for(int i = 2;i <= n;++i) { if(dp[len] < a[i]) dp[++len] = a[i]; else { int pos = upper_bound(dp+1,dp+len+1,a[i])-dp; dp[pos] = a[i]; } } printf("%d\n",len); system("pause"); }View Code
标签:列车,typedef,const,cout,int,练习,PTA,define 来源: https://www.cnblogs.com/zwjzwj/p/13661112.html