解題報告 交誼舞

2021-06-26 16:17:04 字數 1281 閱讀 6105

描述 明顯……交誼舞是2個人跳的,而且一男一女 -__-||||。 由於交誼舞之前的節目安排,所有的表演者都站成了一排。這一排人的順序滿足2點:

排得過於整齊導致那些要表演交誼舞的人都沒辦法看到自己的舞伴,怎麼辦類……. 所幸的是,sdfz的女生比男生聰明得多。她們知道自己左邊有幾個男生。 現在就請你再告訴這些女生,她們的舞伴距離她們多遠(即包括那個男生,一共有多少男生夾在他們之間)。

輸入格式

第一行為乙個數n,表示參與跳交誼舞的女生個數。

第二行n個數,從左到右表示這n個女生左邊分別有多少個男生。

輸出格式

一排n個數,行末無空格。表示n個女生與其舞伴的距離。

6

4 5 6 6 6 6

1 1 1 4 5 6
各個測試點1s

n<=1500,

結果小於2^31-1

演算法:貪心+模擬

簡析:女生選舞伴的原則,往左找第乙個未被挑選的男生(若找非第乙個未被挑選的男生,則之間必然經過第乙個沒被挑選的男生,不符合中間是成對舞伴的條件)

做法:s[i]記錄到i女生在所有人中的編號

man[i]記錄i女生左邊共有多少男生

c[i]記錄可供選擇的男生區間,並保證c[i]遞增,c[i].l,c[i].r為區間的左右邊界,c[i].now為該區間可取的為c[i].l-->c[i].now

列舉1-n個女生,若man[i]>man[i-1]說明多出了乙個可供選擇的男生區間,則加入c[i](加入的是男生在全部人中的編號)

接著輸出c[tot]中可供選擇的男生,若該區間已被取完則tot--,直到找到可供選擇的區間。

注意:c[i]記錄的是男生在全部人中的編號,所以計算起來較複雜

複雜度:o(n^2)

//by king qzqz 

#include#include#includeconst int n=1600;

struct datac[n];

int man[n],s[n],n,lastman,tot;

int main()

//man[i]-man[i-1]是在i和i-1之間的男生,+s[i-1]+1,就是到i女生在所有人中的編號

man[0]=0;

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

while (c[tot].now=1) tot--;//找到乙個可供選擇c[tot].now(舞伴的編號)

int j=1;

while (s[j]=1) tot--;

} return 0;

}

Vijos P1062 迎春舞會之交誼舞

描述 明顯 交誼舞是兩個人跳的,而且是一男一女 由於交誼舞之前的節目安排,所有表演者都要站成一排,這一排人的順序滿足兩點。1 對於一對舞伴,男生站在女生的左邊。2 任何一對舞伴之間,要麼沒有人,要麼有若干對舞伴。排得過於整齊導致那些要表演的人都沒辦法找到自己的舞伴,怎麼辦呢?所幸的是,sdfz的女生...

模擬 Vijos P1062 迎春舞會之交誼舞

題目大意 一群男女站成一排,一男一女配對,女的只找左邊第乙個空閒的男生,給定前n個女生左邊的額男生個數,問前n個女生到男伴之間共有幾個男生。n 1500 女生左側男生231內 題目思路 模擬 每個女生只找左邊的最靠近的閒置男生,所以每當女生左邊的男生數變化的時候就說明隊伍裡加入了新的男生,而這些男生...

迎春交誼舞會之集體舞(Vijos1063)

演算法 dp 分析 跟usaco上的某道題基本上就是完全相同。首先是初始化,對於是 的預處理為1,否則預處理為0。用f i,j 表示 i,j 這個點的最大的三角形的側邊長,每個點由左上 上 右上三個點轉移而來,取乙個最小值 1,同時必須滿足三個點都不是 否則依然為1。先處理衝上的三角形,然後處理沖下...