HDU 2034 - 人見(jiàn)人愛(ài)A-B
你可以直接用C語(yǔ)言去模擬一個(gè)集合,然后每讀入一個(gè)數(shù)字,做一次遍歷,如果找到就刪除。最后才排一次序輸出。
雖然效率很低,時(shí)間復(fù)雜度有O(m*n),但對(duì)付這一題已經(jīng)綽綽有余了。也可以0MS 0K AC掉。
Code:
#include#includeint?cmp(const?int?*a,?const?int?*b) { ????return?*a?-?*b; } int?main(void) { ????int?n,?m,?i,?j; ????int?s[101]; ???? ????while?(scanf("%d%d",?&n,?&m),?m+n) ????{ ????????for?(i?=?0;?i?<?n;?i++) ????????????scanf("%d",?s?+?i); ????????for?(i?=?0;?i?<?m;?i++) ????????{ ????????????scanf("%d",?s?+?n); ????????????for?(j?=?0;?s[j]?!=?s[n];?j++); ????????????if?(j?!=?n)?s[j]?=?s[--n]; ????????} ????????qsort(s,?n,?sizeof(int),?cmp); ????????for?(i?=?0;?i?<?n;?i++) ????????????printf("%d?",?s[i]); ????????printf(n???"n"?:?"NULLn"); ????} ???? ????return?0; }
如果你討厭用線性的查找方式,也可以修改一下。配合使用庫(kù)函數(shù)的二分找和快速排序,來(lái)實(shí)現(xiàn)。
但對(duì)付這題來(lái)說(shuō),有點(diǎn)殺雞用牛刀的感覺(jué),呵呵。
Code:
#include#includeint?cmp(const?int?*a,?const?int?*b) { ????return?*a?-?*b; } int?main(void) { ????int?a; ????int?b; ????int?i; ????int?n; ????int?*p; ????int?s[128]; ???? ????while?(scanf("%d%d",?&a,?&b),?a?||?b) ????{ ????????for?(i?=?0?;?i?<?a?;?i++) ????????????scanf("%d",?s?+?i); ????????qsort(s,?a,?sizeof(int),?cmp); ????????for?(i?=?0?;?i?<?b?;?i++) ????????{ ????????????scanf("%d",?&n); ????????????p?=?bsearch(&n,?s,?a,?sizeof(int),?cmp); ????????????if?(p) ????????????{ ????????????????a--; ????????????????*p?=?s[a]; ????????????????qsort(s,?a,?sizeof(int),?cmp); ????????????} ????????} ????????if?(a) ????????{ ????????????for?(i?=?0?;?i?<?a?;?i++) ????????????????printf("%d?",?s[i]); ????????????putchar('n'); ????????} ????????else ????????????puts("NULL"); ????} ????return?0; }
其實(shí)我們可以用歸并排序的思想來(lái)做。效率從O(m*n) -> O((m+n)log2(m+n))
#include#includeint?cmp(const?int?*a,?const?int?*b) { return?*a?-?*b; } int?main(void) { int?n,?m,?i,?j,?c; int?s[128]; int?t[128]; while?(scanf("%d%d",?&n,?&m),?m+n) { for?(i?=?0;?i?<?n;?i++) scanf("%d",?s?+?i); for?(i?=?0;?i?<?m;?i++) scanf("%d",?t?+?i); qsort(s,?n,?sizeof(int),?cmp); qsort(t,?m,?sizeof(int),?cmp); for?(c?=?i?=?j?=?0;?i?<?n?&&?j?<?m;) { if?(s[i]?<?t[j]) printf("%d?",?s[i++],?c++); else?if?(s[i]?>?t[j]) j++; else { i++; j++; } } for?(;?i?<?n;)?printf("%d?",?s[i++],?c++); printf(c???"n"?:?"NULLn"); } return?0; }
其實(shí)這些集合的操作都包含在C++的set類庫(kù)里了。
這時(shí)候用C++編碼真是提速不少。詳請(qǐng)參見(jiàn)參考代碼。