C++ 活动安排

试题描述:

设有 n 个活动的集合 E={1,2,……,n},其中每个活动都要求使用统一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动 i 都有一个要求使用该资源的起始时间 si 和一个结束时间 fi ,且 si < fi。如果选择了活动 i ,则它在时间区间 [si, fi) 内占用资源。若区间 [si, fi) 与 [sj, fj) 不相交,则称活动 i 与活动 j 是相容的。也就是说,当 fi<=sj 或 fj<= si 时,活动 i 与活动 j 相容。选择出由互相兼容的活动组成的最大集合。

输入:

第一行一个整数 n ;
接下来 n 行,每行两个整数 si 和 fi。

输出:

输出尽可能多的互相兼容的互动个数。

输入示例:

4
1 3
4 6
2 5
1 7

输出示例:

数据范围:n <= 1000.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<iostream>
using namespace std;
int n,begin[1001],end[1001];
void init()//初始化
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>begin[i]>>end[i];//开始与结束时间
    }
}
    void qsort(int x,int y)//排序 从小到大
    {
        int i,j,mid,t;//mid为中间值
        i=x;j=y;mid=end[(x+y)/2];
        while(i<=j)
        {
            while(end[i]<mid)i++;//快速排序
            while(end[j]>mid)j--;//快速排序
            if(i<=j)
            {
                t=end[j];end[j]=end[i];end[i]=t;//从小到大排序
                t=begin[j];begin[j]=begin[i];begin[i]=t;//从小到大排序
                i++;j--;
            }
        }
        if(x<j)qsort(x,j);
        if(i<y)qsort(i,y);
    }
    void solve()
    {
        int ans=0;
        for(int i=1,t=-1;i<=n;i++)
        if(begin[i]>=t)//活动二的开始 开始比活动一的结尾小
        {
            ans++;
            t=end[i];//记录当前活动的结束时间
        }
        cout<<ans;
    }
    int main()
    {
        init();
        qsort(1,n);
        solve();
        return 0;
    }

  这道题和活动选择是基本相同的。

 

在写这道题的时候,先要排序。

排序的方法有桶排序,快速排序。。。。

 

给一个快排

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include<iostream>
using namespace std;
int a[1000],n=0,p,z,flag=0;
void qsort(int x,int y)
{
     int i=x,j=y,mid=a[(x+y)/2];
    while(i<=j)
    {
        while(a[i]<mid)i++;
        while(a[j]>mid)j--;
        if(i<=j)
        {
            swap(a[i],a[j]);
            i++;
            j--;
        }
    }
    if(x<j)qsort(x,j);
    if(i<y)qsort(i,y);
}
int main()
{
    while(scanf("%d",&p)==1)
    {
        n++;
        a[n]=p;    
    }
    qsort(1,n);
    for(int m=1;m<=n;m++)
    {
        if(m==n)
        {
                cout<<a[m];
        }
        else cout<<a[m]<<" ";
    }
    return 0;  
}

  

posted @   FXY_ssf  阅读(1406)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示