Codeforces Round#22 (Div 2 only) D. Segments
問題概要
x軸上のn本の線分が与えられる。x軸上にnailという点を好きなだけ置くことができて、これが線分と交わる(両端を含む)とき、その線分は"nailed"されたという。全ての線分をnailedにするために必要な最小のnailの数をもとめ、そのようなnailの座標を一組出力せよ。
条件を満たせばどのような座標を出力してもかまわない。
n≤1000を満たす。
解法
まだnailedでない線分のうち最も左にあるものから見ていき、右側の座標の最小値にnailを置いていく。
このような貪欲法の解法で正しい答えが出力される……らしい(なぜだろう)
ソースコード
void run() { int n; cin>>n; vector<pi> seg; rep(i,n){ int a,b; cin>>a>>b; if(a>b)swap(a,b); seg.pb(mp(a,b)); } sort(all(seg)); vi nail; int prev=-inf; rep(i,n){ if(prev>=seg[i].first)continue; int mn=seg[i].second; for(int j=i+1;j<n;j++)mn=min(mn,seg[j].second); nail.pb(mn); prev=mn; } cout<<nail.size()<<endl; rep(i,nail.size())cout<<nail[i]<<(i==nail.size()-1?"\n":" "); }