P1091 合唱隊形

2022-04-12 02:44:51 字數 1311 閱讀 2231

◦          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 ...