描述
南陽有一家灰常勢利的醫院,這家醫院有乙個灰常勢利的門診醫生,由於他的醫術比較高明,所以每天都有很多人來看他的門診。但是,他很勢利,所以他看病有乙個規矩,那就是優先給有錢的人看病。他事先了解了掛他的號的病人的家庭經濟情況,所以,當輪到某病人就診時,如果剩下的病人裡有比他更富有的病人,那麼他就必須得站到看病隊伍的最後面重新等待;如果沒有,那麼黑心醫生就會立即給他看病,而且保證能看好他的病(難怪他的生意這麼好哦!)。
現在我想知道當某病人看完病後黑心醫生一共看好了幾名病人,是不是很簡單
輸入
輸入包含多組測試資料。
每組資料佔兩行:
第一行:兩個整數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利用佇列,來模擬排隊的情況。如果當前隊首元素不是富裕程度最大的,那麼就講這個元素出隊,再入隊尾。所那麼問題來了,怎麼知道隊首元素是不是當前最大的?所以就要用到乙個陣列a來儲存富裕程度由大到小的排序,判斷隊首元素是不是最大的時候,就把它與陣列a中的乙個數值比較,比較匹配了以後,將元素出隊,然後陣列下標後移,繼續進行下乙個最大值得匹配。25
同時沒出乙個元素,就要把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,...