Hrbust 合唱隊形

2021-09-16 22:04:40 字數 1571 閱讀 5964

description

一年一度的清明節又要到了(?)

學校決定開個晚會慶祝一下(?)

由於泥工男孩子實在太多啦,跳舞是不可能跳舞的。於是他們決定站成一排唱歌。

眾所周知的,**老師往往都是有強迫症的人。他想要讓最終隊形的身高序列從左到右先嚴格不減再嚴格不增。比如(1,2,3,2,1),(1,4,4,2),(1,2,3)都是合法序列,但是(8,7,9)不是。

為了使得這個序列合法,**老師可以每次交換兩個相鄰的同學的位置。現在她想求助你,最少進行多少次交換才能使這個隊形合法

input

多組資料。

第一行乙個整數 t 表示資料組數(t<=5)

對於每一組資料:

第一行乙個整數 n 表示佇列人數(1<=n<=100000)

第二行 n 個正整數 ai 表示佇列中每個人的身高(1<=ai<=100000)

output

對於每一組資料,輸出一行乙個整數表示最小操作次數

sample input27

3 1 4 1 5 9 2

910 4 6 3 15 9 1 1 12

sample output38

【題意】:

就是構造乙個佇列,這個佇列可以是:1、一直遞增  或者  2、先遞增後遞減。

【官方題解】:

從小到大考慮每個人最終的位置。

假設x是當前最矮的人,顯然他不論是放到最左還是放到最右都不影響其他點的答案,因此我們只需要詢問對於當前這個點,往左放還是往右放比較優即可。

需要注意有多個值相同的情況。

【題解】:

注意最後一句話了嗎????多個值相同的時候,如果放左邊用多個值 相同的最左邊的那個放過去,

相同地,如果多個值相同,放右邊比較好,那麼就要用最右邊的值放過去。

希望能快點把題放出來吧,這個我就可以交上去了。

#includeusing namespace std;

const int n = 1e5+100;

typedef long long ll;

typedef struct node

a[n+1].x = 0x3f3f3f3f;

a[n+1].no = -1;

sort(a+1,a+n+1,cmp1);

int l = 1 ,r = n ,cnt = 0 , tmp = 1 ,t;

ll ans = 0;

for(int i=1;i<=n;i+=tmp)

tmp = cnt ;

for(int j=0;j::iterator it1 = lower_bound( s.begin(),s.end(), b[j]);

int t1 = distance( s.begin(),it1 );

int t2 = distance( it1,s.end() ) - 1;

//printf("%d %d %d %d\n",b[j].x,b[j].no,t1,t2);

if( t1 <= t2 )

else}}

printf("%lld\n",ans);

}return 0;

}

合唱隊形 DP

合唱隊形 chorus.pas c cpp n位同學站成一排,老師要請其中的 n k 位同學出列,使得剩下的k位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2 k,他們的身高分別為t1,t2,tk,則他們的身高滿足t1 ti 1 tk 1 i k 你的任務是,已知所...

合唱隊形 dp

題目描述 n位同學站成一排,老師要請其中的 n k 位同學出列,使得剩下的k位同學不交換位置就能排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2,k,他們的身高分別為t1,t2,tk,則他們的身高滿足t1 t2 ti ti ti 1 tk 1 i k 你的任務是,已知所有...

合唱隊形 NOIP

合唱隊形 noip time limit 1000ms memory limit 65536k description n位同學站成一排,老師要請其中的 n k 位同學出列,使得剩下的k位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2 k,他們的身高分別為t1,t2...