nyoj 754 黑心醫生

2021-06-28 17:10:02 字數 2172 閱讀 4972

描述

南陽有一家灰常勢利的醫院,這家醫院有乙個灰常勢利的門診醫生,由於他的醫術比較高明,所以每天都有很多人來看他的門診。但是,他很勢利,所以他看病有乙個規矩,那就是優先給有錢的人看病。他事先了解了掛他的號的病人的家庭經濟情況,所以,當輪到某病人就診時,如果剩下的病人裡有比他更富有的病人,那麼他就必須得站到看病隊伍的最後面重新等待;如果沒有,那麼黑心醫生就會立即給他看病,而且保證能看好他的病(難怪他的生意這麼好哦!)。

現在我想知道當某病人看完病後黑心醫生一共看好了幾名病人,是不是很簡單

輸入

輸入包含多組測試資料。

每組資料佔兩行:

第一行:兩個整數n和m(n<1000),分別表示來看病的總人數和要詢問的病人掛的號(病人掛的號從0開始,從左到右依次累加)。

第二行:n個整數,分別對應病人的經濟情況(n個整數均能用32位整數表示)。

輸出輸出單獨佔一行,輸出當病號為m的病人看完病後,黑心醫生一共看好了幾名病人。

樣例輸入

1 0

54 2

1 2 3 4

6 01 1 9 1 1 1

樣例輸出

1

25

利用佇列,來模擬排隊的情況。如果當前隊首元素不是富裕程度最大的,那麼就講這個元素出隊,再入隊尾。所那麼問題來了,怎麼知道隊首元素是不是當前最大的?所以就要用到乙個陣列a來儲存富裕程度由大到小的排序,判斷隊首元素是不是最大的時候,就把它與陣列a中的乙個數值比較,比較匹配了以後,將元素出隊,然後陣列下標後移,繼續進行下乙個最大值得匹配。

同時沒出乙個元素,就要把s+1,意思是又看完乙個人的病了,然後把當前的s賦值給陣列sum下標為當前出隊元素的病號的那乙個。

#include #include #include #include using namespace std;

typedef struct

node;

queueq;

int a[1003], sum[1003];//a陣列表示富裕程度的排序,sum陣列存放當前下標為病號的已經看完病的總人數。

int cmp(int a, int b)

int main()

sort(a, a+n, cmp);

max = 0;

while(max != n)

q.pop();

sum[v.no] = s + 1;

s++;

max++;

}printf("%d\n", sum[m]);

}return 0;

}

下面的做法是模擬佇列,但是沒有具體模擬出隊入隊情況,就是找到最富裕的病人,看看他是不是第m號,是的話就輸出當前看完的總病人數,不是的話就總病人數+1,將他「刪除」,繼續找下乙個最富裕的,再判斷是不是m……。

那麼為什麼還需要佇列?因為在富裕程度相同的情況下,是要根據在佇列中的順序確定出隊順序的,所以佇列還是要模擬的。

這裡是模擬鍊錶,用乙個father乙個next來模擬前後指標,每看完乙個病人刪除的時候,並不是把陣列整體移動,而是修改father和next來模擬鍊錶的刪除。

/* nyoj-754 黑心醫生 

結構體陣列模擬佇列

練習: nyoj-303、647

*/#include #define n 1005

struct node;

node p[n]; // 病人陣列,下標代表病人編號

int find_max_father(int cur)

next = p[next].next; }

return ans;

}int main()

p[0].father = n - 1; // 特殊結點、特殊處理

p[n - 1].next = 0;

int top = n - 1, count = 0; // top指當前隊首病人編號,count是已**病人總數

while(1)

p[ p[top].father ].next = p[top].next; // '刪除'已**病人

p[ p[top].next ].father = p[top].father;

top = p[top].next; // 更新隊首結點

}; }

return 0;

}

NYOJ 75 日期計算

時間限制 3000 ms 記憶體限制 65535 kb 難度 1描述 如題,輸入乙個日期,格式如 2010 10 24 判斷這一天是這一年中的第幾天。輸入 第一行輸入乙個數n 0輸出 每組輸入資料的輸出佔一行,輸出判斷出的天數n 樣例輸入 3 2000 4 5 2001 5 4 2010 10 24...

NYOJ 75 日期的計算(打表 日期類水題)

描述如題,輸入乙個日期,格式如 2010 10 24 判斷這一天是這一年中的第幾天。輸入 第一行輸入乙個數n 0輸出 每組輸入資料的輸出佔一行,輸出判斷出的天數n 樣例輸入 3 2000 4 5 2001 5 4 2010 10 24 樣例輸出 96 124297 雖然很簡單,還是套模板做了,因為打...

75 顏色分類

給定乙個包含紅色 白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色 白色 藍色順序排列。此題中,我們使用整數 0 1 和 2 分別表示紅色 白色和藍色。注意 不能使用 庫中的排序函式來解決這道題。示例 輸入 2,0,2,1,1,0 輸出 0,0,1,1,2,...