◦ n 位同學站成一排,**老師要請其中的( n−k )位同學出列,使得剩下的 k 位同學排成合唱隊形。
◦ 合唱隊形是指這樣的一種隊形:設k位同學從左到右依次編號為 1,2,…,他們的身高分別為 t_1,t_2,…,t_k
◦ 則他們的身高滿足 t1t_i+1> ...>tk
◦ 你的任務是,已知所有n位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱隊形。
◦ n<=100000
題解
◦ 我們設f[i]表示以i結尾的最長上公升子串行長度。
◦ 我們設g[i]表示以i開頭的最長下降子串行長度。
◦ 然後我們列舉哪乙個為中心的最高點,f[i]+g[i](-1)取最大值即可。
具體操作:
1.對於輸入的身高,正著跑一遍 lis ,求出 f[i] ,並且記錄對於第 i 個身高在 f[i] 中是否使用過
2.對於輸入的身高,反著跑一遍 lis ,求出 g[i] ,並且記錄對於第 i 個身高在 g[i] 中是否使用過
3.列舉每個點作為**結點,判斷 i 在 f[i] g[i] 中是否都使用過,都使用過就 -1 ,此處使用位運算&,求出最長的合法序列
4.ans - 最長合法序列
**
#include#include#include
#include
#include
#include
#include
#include
using
namespace
std;
inline
intread()
const
int maxn=1e5+10
;int n,len=0,ans=1
;int
a[maxn],b[maxn],d[maxn],f[maxn],g[maxn];
bool
use1[maxn],use2[maxn];
intmain()
len=0;memset(d,0,sizeof(0
)); d[++len]=b[1];g[1]=1;use2[1]=1
;
for(int i=2;i<=n;i++)
for(int i=1;i<=n;i++)
printf("%d
",n-ans);
return0;
}
P1091 合唱隊形
n位同學站成一排,老師要請其中的 n k 位同學出列,使得剩下的k位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2 k,他們的身高分別為t1,t2,tk,則他們的身高滿足t1 ti 1 tk 1 i k 你的任務是,已知所有n位同學的身高,計算最少需要幾位同學出列,...
P1091 合唱隊形
nnn位同學站成一排,老師要請其中的 n kn kn k 位同學出列,使得剩下的kkk位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2,k1,2,k1,2,k,他們的身高分別為t1,t2,tkt 1,t 2,t kt1 t2 tk 則他們的身高滿足t1 ti 1 t...
P1091 合唱隊形
題目描述 nnn位同學站成一排,老師要請其中的 n kn kn k 位同學出列,使得剩下的kkk位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2,k1,2,k1,2,k,他們的身高分別為t1,t2,tkt 1,t 2,t kt1 t2 tk 則他們的身高滿足 t1 ...