题意:给定字符串s,s只包含小写字母,请求出字典序最大的子序列。(看例子就能看明白)
思路:从这个字符串a后面开始比较,先把最后一个字母存进s,然后那那s中最新的一个元素跟a中上一个进行比较,如果a不比s小,则存入s,并把这个看做新哒~
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int inf = 0x3f3f3f3f; char s[100007]; int main() { string a; while(cin>>a){ int i,t; s[0]=a[a.length()-1]; t=0; // cout<<a.length()<<endl; for(i=a.length()-2;i>=0;i--){ if(a[i]>=s[t]){ s[++t]=a[i]; } } for(;t>=0;t--){ cout<<s[t]; } cout<<endl; } return 0; }
B 漂亮的树
思路:对每棵树的高度减去下标,看哪个高度出现次数最多就保留
#include<bits/stdc++.h> #define pp 1e5 using namespace std; int n,a[100010],f[1000010],ansn; int main(){ cin>>n; for (int i=1;i<=n;i++) cin>>a[i]; for (int i=1;i<=n/2;i++) a[i]-=i; for (int i=n;i>n/2;i--) a[i]-=(n-i+1); for (int i=1;i<=n;i++)f[a[i]+100000]++; for (int i=0;i<=pp*3;i++) ansn=max(ansn,f[i]); cout<<n-ansn<<endl; return 0; }