區(qū)間最大重疊數(shù)

http://acm.nyist.net/JudgeOnline/problem.php?pid=220


#include<cstdio>
#include<algorithm>
#include<string.h>
using namespace std;
int main(){
    int t;
    scanf("%d",&t);
    while(t--) {
           int n;
           scanf("%d",&n);
           int sum=0;
           int arr[410];
           memset(arr,0,sizeof(arr));
           for(int i=0;i<n;i++)
           {
               int l,r;
               scanf("%d%d",&l,&r);
               if(l&1) l++;
               if(r&1) r++;
               if(l>r)
               {
                   l^=r;
                   r^=l;
                   l^=r;
               }
               for(int j=l;j<=r;j++)
               {
                   arr[j]++;
                   sum=max(sum,arr[j]);
               }
           }
           printf("%d\n",sum*10);
    }
    return 0;
}

http://www.scut.edu.cn/oj/ 題號:1924
http://blog.csdn.net/cxllyg/article/details/8200395

假設(shè)要在足夠多的會場里安排一批活動,并希望使用盡可能少的會場。設(shè)計一個有效的貪心算法進(jìn)行安排。(這個問題實際上是著名的圖著色問題。若將每一個活動作為圖的一個頂點,不相容活動間用邊相連。使相鄰頂點著有不同顏色的最小著色數(shù),相應(yīng)于要找的最小會場數(shù)。)
要求:對于給定的k個待安排的活動,編程計算使用最少會場的時間表。

題解:為了有效地對這n個活動進(jìn)行安排,首先將n個活動區(qū)間的2n個端點排序。然后,用掃描算法,從左到右掃描整個直線。在每個事件點處(即活動的開始時刻或結(jié)束時刻)作會場安排。當(dāng)遇到一個開始時刻,就將活動安排在一個空閑的會場中。遇到一個結(jié)束時刻,就將活動占用的會場釋放到空閑會場棧中,已備使用。經(jīng)過這樣一遍掃描后,最多安排了m個會場(m是最大重疊區(qū)間數(shù))。

#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<iterator>
using namespace std;
struct point{
    int time,flag;
}arr[20010];
int cmp(const void *a,const void * b)
{
    return (*(point*)a).time-(*(point*)b).time;
}
int main(){
   int n,a;
   scanf("%d",&n);
   n<<=1;
   for(int i=0;i<n;i++)
   {
       scanf("%d",&a);
       arr[i].time=a;
       arr[i].flag=i&1;
   }
   qsort(arr,n,sizeof(point),cmp);
   int cnt=0,curr=0;
   for(int i=0;i<n;i++)
   {
       if(arr[i].flag) curr--;
       else
       {
           curr++;
       }
       if((i==n-1||arr[i].time<arr[i+1].time)&&curr>cnt)
        cnt=curr;
/*處理arr[i]==arr[i+1]的情況.當(dāng)cur>cnt且arr[i]==arr[i+1]時,i+1時間可能是開始時間,也可能是
結(jié)束時間。如果i+1是結(jié)束時間,那么i是開始時間,說明某活動開始時間和結(jié)束時間相同,不需
要會場,故不對cnt更新;如果i+1是開始時間,那么i是結(jié)束時間,也就是說這兩個事件是可以用同
一個會場的,那么這兩個時間段可以連在一起當(dāng)作一個時間段,
也就是那在i+1次再更新,可以看出在i+1次更新cnt效果是一樣的,因此i次
不進(jìn)行更新。*/
   }
   printf("%d\n",cnt);
    return 0;
}
 
/**************************************************************
    Problem: 1924
    User: 201530542552
    Language: C++
    Result: Accepted
    Time:12 ms
    Memory:1120 kb
****************************************************************/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容