這道題感覺就是greedy的題。但是還是看了解題報告。知道做法後實現很簡單,只需要注意測試資料中有左端點的x座標大於右端點的x座標的情況,調換下即可。
貪心的策略是按照x從左往右掃瞄,如果某一列(某乙個x值)對應(被覆蓋)的牆的個數cnt大於k,那麼需要從這些牆中刪掉cnt - k 個。刪除的順序是將牆按照右端點的x值從大到小的順序排序,按順序刪除。
這樣做的大致思路是因為對每個「覆蓋牆」我們不用考慮其左端點(因為左邊的所有列已經是滿足條件的),右端點大的覆蓋的右邊的x多,所以先刪除。這不是個證明。證明請參考其他資料。
因為牆的個數很少(100個以下),所以實現的時候都是最*****的方法逐個掃瞄判斷是否覆蓋當前x。因為每次都需要牆是按照右端點x值排序,所以提前一次把牆排序好。
thestoryofsnow
1230
accepted
164k
0msc++
1946b
/*
id: thestor1
lang: c++
task: poj1230
*/#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
const int maxn = 100;
class wall
wall(int x1, int x2, int y) : x1(x1), x2(x2), y(y), removed(false) {}
inline bool operator> (const wall &rhs) const };
int main()
walls[i].removed = false;
} sort(walls, walls + n, std::greater());
// printf("[debug]walls:\n");
// for (int i = 0; i < n; ++i)
// int nremoved = 0;
for (int x = 0; x <= 100; ++x)}}
// if some walls need to be removed
if (cnt > k)}}
}} printf("%d\n", nremoved);
}return 0;
}
HDU 1230解題報告
problem description 讀入兩個不超過25位的火星正整數a和b,計算a b。需要注意的是 在火星上,整數不是單一進製的,第n位的進製就是第n個素數。例如 地球上的10進製數2,在火星上記為 1,0 因為火星個位數是2進製的 地球上的10進製數38,在火星上記為 1,1,1,0 因為火...
poj解題報告 1328
不得不說,這題是讓我飽受折磨,畢竟第一次做貪心演算法,而且wa了好多次,幸好有學長的幫助,最終找到了問題所在,是在快排上是問題,double高位不可向int低位轉換,由於一開始強制轉換導致雖然樣例和其他的測試資料過了,但還是wa,現在改完了就對了,附上ac ps 這題通過率是22 真心不簡單 如下 ...
poj解題報告 2586
這題我是用的貪心演算法,其實不用也可以,列舉也能解決,因為情況不多。因為是每連續5個月必有虧損,而一年只有1 5,2 6,3 7,4 8 8 12共8種情況。現在設盈餘為s,虧損為d,可列出以下幾種情況。ssssdssssdss 4ssssddsssddss 3s 2d ssdddssdddss 2...