P8736 [藍橋杯 2020 國 B] 遊園安排

纯粹的發表於2024-03-30

原題連結

題解

1.二分+dp

code

#include<bits/stdc++.h>
using namespace std;
string name[1000005],dp[1000005],st[1000005];
int main()
{
    string s;
    cin>>s;

    int cnt=0;
    for(int i=0;s[i];i++)
    {
        if(isupper(s[i])) name[++cnt]=s[i];
        else name[cnt]+=s[i];//處理字串
    }


    int len=0;
    for(int i=1;i<=cnt;i++)
    {
        int pos=lower_bound(st+1,st+1+len,name[i])-st;//找到這個人在他包括他之前的位置
        len=max(len,pos);
        st[pos]=name[i];//name[i]要小於st[pos]
        dp[pos]=dp[pos-1]+name[i];//dp
    }

    cout<<dp[len];
    return 0;
}