Codeforces 527D 【Clique Problem】 題解
阿新 • • 發佈:2018-12-13
這是一道神奇的貪心題。
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct node { int l; int r; }a[2000005]; bool comp(node c,node d) { if(c.l<d.l) return 1; if(c.l>d.l) return 0; if(c.r<d.r) return 1; return 0; } int main() { int n,ans=0; cin>>n; for(int i=1;i<=n;++i) { int x,w; scanf("%d%d",&x,&w); a[i].l=x-w; a[i].r=x+w; } sort(a+1,a+n+1,comp); for(int i=n;i>=1;--i) { int len=i; ans++; while(i-1<=n&&a[len].l<a[i-1].r) --i; } cout<<ans; return 0; }
對於每一個點,你可以把它視為一條線段,左端點為x-w,右端點為x+w。這樣對於每個abs(xi-xj)>=wi+wj,我們預設xi>=xj,那麼就可以轉化為xi-wi>=xj+wj,由此就可以退出由i號點構造出來的線段的左端點在由j號點構造出來的線段的右端點的右邊,即這兩條線段沒有交點。因此這道題目就變成了:求n條線段中最多能選出多少條不相交的線段。