CDOJ 1150 排名表 拓撲排序

2021-07-15 22:41:47 字數 1446 閱讀 6355

就是說有n個人,編號1-n,他們有乙個排名表,然後已知m條資訊,每條資訊為a b,表示a在b前面

然後叫你寫出乙個滿足這m個條件的排名表,

如果有多個的話,盡可能使1的名次最小,這個條件下,盡可能使2的名詞最小,依次類推

然後從1-n輸出每個人的名次(確實,被這個坑了一次,眼瞎

然後呢,給的解法是反向建圖,然後拓撲排序,貪心,每次選編號最大的

呃,又是這種情況,就是我可以去理解這樣為什麼是對的,但是叫我想出來,可能不容易想出來,感覺還是應該多做多練吧

呃,為什麼這樣是對的呢,因為有這個限制條件:讓編號為1的人的名次盡量小,然後讓編號為2的人的名次盡量小,然後讓編號為3的人的名次盡量小......

我們拓撲排序時,是選第一名是誰,第二名是誰,這樣選的,所以,正向的話,我們可以實現,第一名的編號盡量小,然後第二名的編號盡量小,然後,,,

顯然,這個條件和題目給的條件是不等價的

題目的條件,我們怎麼理解呢,我們可以這樣理解,盡量先選1,然後再盡量先選2,然後再盡量先選3,然後,,

這個不容易做啊,因為我們使1盡量先選,那就是找到1,然後,先把它給 排序了,就是,假如是3->4->1的話,就是3是第1名,4是第2名,1是第3名,然後這樣選,選完1選2,,這樣選,但是假如是3->4>1,7->2->1呢,我們發現,從1往回退時,還是每次選編號大的退,這樣就使編號小的盡量靠前了,然後就跟下面的思路類似了

但是拓撲排序只能實現第i名的編號是盡量大還是盡量小,怎麼辦呢,

假如我們是反向建圖,倒著選的話,就行先選最後一名,最後選第一名,那題目的限制條件就變為,盡量使1最後選,,然後盡量使2最後選,然後盡量使3最後選,我們發現,這就是說,我們盡量後選編號小的,編號越小我們越最後選,就是說,編號越大,我們越先選,所以就可以每次選編號大的,然後就可以了

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

#define maxn 202

#define maxm 202

bool graph[maxn][maxm];

int in[maxn];

int ans[maxn];

bool vis[maxn];

int main()

int cnt = n;

while (1)

}break;}}

if (flag)

break;

} if (cnt > 0)

printf("-1\n");

else

}} //while (1);

return 0;

}

題目1014 排名

題目描述 今天的上機考試雖然有實時的ranklist,但上面的排名只是根據完成的題數排序,沒有考慮每題的分值,所以並不是最後的排名。給定錄取分數線,請你寫程式找出最後通過分數線的考生,並將他們的成績按降序列印。輸入 測試輸入包含若干場考試的資訊。每場考試資訊的第1行給出考生人數n 0 n 1000 ...

題目1014 排名

題目描述 今天的上機考試雖然有實時的ranklist,但上面的排名只是根據完成的題數排序,沒有考慮每題的分值,所以並不是最後的排名。給定錄取分數線,請你寫程式找出最後通過分數線的考生,並將他們的成績按降序列印。輸入 測試輸入包含若干場考試的資訊。每場考試資訊的第1行給出考生人數n 0 n 1000 ...

題目1014 排名

學到了 開始要用排序了!解決 我還想著寫排序演算法 真是好蠢啊 應該用sort函式的 之前用過一遍但是又給忘了 include 注意這個裡面的有的 最好用它的這個 裡有 各個函式的介紹 很關鍵啊 sort 的排序詳細介紹在這個網頁裡面 2 問題 二進位制 沒有找到接受 std string 型別的右...