1. 程式人生 > >題解 luogu P1803 【凌亂的yyy】

題解 luogu P1803 【凌亂的yyy】

這題是一個基本的貪心思想,由於我們要讓一個比賽給後面的比賽空出儘可能多的時間,我們要讓每個出現在日程表上比賽的結束時間越早越好。

先排序,再根據結束時間順序選擇。

#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;
}