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