題解 luogu P1803 【凌亂的yyy】
阿新 • • 發佈:2018-12-02
這題是一個基本的貪心思想,由於我們要讓一個比賽給後面的比賽空出儘可能多的時間,我們要讓每個出現在日程表上比賽的結束時間越早越好。
先排序,再根據結束時間順序選擇。
#include<bits/stdc++.h> using namespace std; int a[1010000][3]; void haha(int l,int r) { int i,j,x,y,n; x=a[(l+r)/2][2];i=l;j=r; do{ while(a[i][2]<x)i++; while(a[j][2]>x)j--; if (i<=j) {swap(a[i][1],a[j][1]);swap(a[i][2],a[j][2]);i++;j--;} }while(i<=j); if (i<r)haha(i,r); if (j>l)haha(l,j); }//以活動時間結束先後順序快排 int main() { int i,j,x=0,n,y=0; cin>>n; for (i=1;i<=n;i++)cin>>a[i][1]>>a[i][2];//分別讀入開始與結束時間 haha(1,n);//快排 for (i=1;i<=n;i++) if (a[i][1]>=y)//如果遇上一個活動為重疊,選擇結束時間早的 {x++;y=a[i][2];}//總數加一 cout<<x; return 0; }