列表

详情


AB31. 活动安排

描述

给定n个活动,每个活动安排的时间为。求最多可以选择多少个活动,满足选择的活动时间两两之间没有重合。

输入描述

第一行输入一个整数n (),表示可选活动个数。
接下来的n行,每行输入两个整数a_i,b_i (),表示第i个活动的时间。

输出描述

输出一行一个整数,表示最多可选择的活动数。

示例1

输入:

3
1 4
1 3
3 5

输出:

2

原站题解

C++ 解法, 执行用时: 60ms, 内存消耗: 2040KB, 提交时间: 2022-05-01

#include <bits/stdc++.h>

using namespace std;
int n;
#define maxn 200000+10
struct node
{
    int st,ed;
    bool operator < (const node & tmp)const 
    {
        return ed < tmp.ed;
    }
}a[maxn];
int main()
{
    scanf("%d",&n);
    int st,ed;
    for(int i =0;i<n;i++)
    {
        scanf("%d%d",&a[i].st,&a[i].ed);
    }
    sort(a,a+n);
    int cnt=0;
    int pre = -1;
    for(int i =0;i<n;i++)
    {
        if(a[i].st >= pre)
        {
            cnt++;
            pre = a[i].ed;
        }
    }
    printf("%d\n",cnt);
    return 0;
}

C++ 解法, 执行用时: 68ms, 内存消耗: 3460KB, 提交时间: 2022-04-13

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<utility>
#include<map>
#include<stack>
#include<sstream>
#include<math.h>
#include<bitset>
#include<queue>
#include<iostream>
using namespace std;
int n,ans=0;
struct node {
	int a;
	int b;
}h[200005];
struct nodd{
	int aa;
	int bb;
}k[200005];
bool cmp(node x,node y){
	return x.b<y.b;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) scanf("%d%d",&h[i].a,&h[i].b);
	sort(h+1,h+1+n,cmp); 
	int m=0;
	for(int i=1;i<=n;i++){
		if(i==1) {
			k[m].aa=h[i].a;
			k[m].bb=h[i].b;
			m++;
			ans++;
			continue;
		}
		if(h[i].a>=k[m-1].bb) {
			ans++;
			k[m].aa=h[i].a;
			k[m].bb=h[i].b;
			m++;
        }
	}
	cout<<ans<<endl;
	return 0;
}

C 解法, 执行用时: 69ms, 内存消耗: 1784KB, 提交时间: 2022-06-07

#include <stdio.h>
#include <stdlib.h>
 
//快速排序法
int quick_sort(int *a, int *b, int low, int high)
{
    int i = low; //第一位
    int j = high; //最后一位
    
    int temp = rand()%(high-low)+low;
    int keya = a[temp]; //将第一个数作为基准值-- 先找到一个基准值
    int keyb = b[temp];
    a[temp]=a[i];
    b[temp]=b[i];
    
    //进行排序---> 最终结果就是 左面的 都比基准值小 ,右面的都比 基准值大,所以这是所有循环的结束条件

    while (i < j)
    {
        //下面的循环执行的条件是 如果右面的比基准值大,就赋一下值,否则继续向前移动
        //---如果直接把循环写成下面这样---
        //while(a[j] >= key) //如果下面的不写这个i<j,这个就出错、越界,并且排序不准--理由:
        //如果i<j,并且: 右面的值 大于 基准值 时,j往前移动一个
        //i 跟 j 的可能情况 只有 i<j i==j
        while(i < j && b[j] >= keyb)//i<j 是 当前while循环的结束条件,如果没有这个,i会大于j,出现越界,错误 
        {
            j--;//继续走
        }//如果不成立,也就是 a[j] <= key;右面的比key小了,那就换个位置
        //把a[j]的数据给a[i]	
        b[i] = b[j];
        a[i] = a[j];
 
        //将事先保存好的基准值与左边的值进行比较,如果基准值大,保持不变,i往前
        //然后 判断一下这个新的a[i],也就是之前的a[j]跟key值的关系---> 一定是 a[i]<key
        //所以把i向前移动一下,i++
        while(i < j && b[i] < keyb)
        {
            i++;
        }
        //移动完以后,把新的位置的a[i]的数值 给刚才的 a[j],然后开始下一次循环
        b[j] = b[i];
        a[j] = a[i];
    }
 
    //跳出循环,将基准值放入数据a[i]中
    b[i] = keyb;
    a[i] = keya;
    //对基准值左边 的所有数据 再次进行快速查找(递归)
    if (i-1 > low) 
    {
        quick_sort(a, b, low, i-1);
    }
 
    //对基准值右边的所有数据再次进行快速查找(递归)
    if (i+1 < high)
    {
        quick_sort(a, b, i+1, high);
    }
 
    return 0;
} 
 
int main()
{
    int num;
    scanf("%d", &num);

    int raws[num];
    int rawf[num];
    
    for (int i=0;i<num;i++){
        scanf("%d %d", &raws[i], &rawf[i]);
    }
 
    //调用-快排
    quick_sort(raws, rawf, 0, num-1);//数组,0 ,num-1

 
    // 选择数据
    int curend=rawf[0];
    int count=1;
    
    for (int k=1;k<num;k++){
        if(raws[k]>=curend){
            curend=rawf[k];
            count++;
        }
    }

    printf("%d",count);   
    
    
    return 0;
}




/*int main(){
    int num;
    scanf("%d", &num);

    int raws[num];
    int rawf[num];
    int rawdiff[num];
    
    for (int i=0;i<num;i++){
        scanf("%d %d", &raws[i], &rawf[i]);
        //rawdiff[i]=rawf[i]-raws[i];
    }

    int sorts[num];
    int sortf[num];
    int sortdiff[num];
    int sortcount=0;

    // 双重排序
    for (int j=0; j<num; j++){
    if(j==0){
        sorts[0]=raws[0];
        sortf[0]=rawf[0];
        //sortdiff[0]=rawdiff[0];
        //sortcount++;
                 }
    else{
        for(int m=0;m<num;m++){
            if(rawf[j]<=sortf[m]){
                    for(int n=j;n>m;n--){
                       sorts[n]=sorts[n-1];
                       sortf[n]=sortf[n-1];
                       //sortdiff[m]=sortdiff[n-1];
                    }
                    sorts[m]=raws[j];
                    sortf[m]=rawf[j];
                    //sortdiff[m]=rawdiff[j];
                    //sortcount++;
                    break;
            }
            else{
                if((m+1)<j)
//                    if(raws[j]>=sorts[m] && raws[j]<sortf[m]){
//                        break;
//                    }
//                    else 
                    continue;
                else{
                    sorts[j]=raws[j];
                    sortf[j]=rawf[j];
                    //sortdiff[j]=rawdiff[j];
                    //sortcount++;
                }
            }
         }
      }
    }

    // 选择数据
    int index=0;
    int count=1;

    for (int k=1;k<num;k++){
        if(sorts[k]>=sortf[index]){
            index=k;
            count++;
        }
    }

printf("%d",count);


}*/


C 解法, 执行用时: 71ms, 内存消耗: 1804KB, 提交时间: 2022-06-19

#include <stdio.h>
#include <stdlib.h>

void quickSort(int *a, int *b, int start, int end) {
    if (start < end) {
        int tempIndex = rand()%(end - start + 1)+start, tmp;
        tmp = b[start];
        b[start] = b[tempIndex];
        b[tempIndex] = tmp;
        tmp = a[start];
        a[start] = a[tempIndex];
        a[tempIndex] = tmp;
        
        int target = b[start], targetA = a[start], i = start, j = end;
        while(i < j) {
            while(i < j && b[j] > target) {
                j--;
            }
            if(i < j) {
                b[i] = b[j];
                a[i] = a[j];
                i++;
            }
            while(i < j && b[i] < target) {
                i++;
            }
            if(i < j) {
                b[j] = b[i];
                a[j] = a[i];
                j--;
            }
        }
        b[i] = target;
        a[i] = targetA;
        
        quickSort(a, b, start, i - 1);
        quickSort(a, b, i + 1, end);
    }
}

int cmp(const void **a, const void **b) {
    return (*((int **)a))[1] - (*((int **)b))[1];
}

int main() {
    int n, i = 0, count = 0;
    scanf("%d", &n);
    
    int *a = (int *)malloc(sizeof(int) * n);
    int *b = (int *)malloc(sizeof(int) * n);
    while(i < n) {
        scanf("%d %d", &a[i], &b[i]);
        
        i++;
    }
    
    quickSort(a, b, 0, n - 1);
      
    i = 0;
    count = 0;
    int minEnd = b[0], nextEnd, startK = 0;
    while(minEnd != 1000000001) {
        count++;
        
        nextEnd = 1000000001;
        for (int k = startK; k < n; k++) {
            if (a[k] >= minEnd && b[k] < nextEnd) {
                nextEnd = b[k];
                startK = k + 1;
                break;
            }
        }
        
        minEnd = nextEnd;
    }
    free(a);
    free(b);
    
//     int **ab = (int **)malloc(sizeof(int *) * n);
//     while(i < n) {
//         ab[i] = (int *)malloc(sizeof(int) * 2);
        
//         scanf("%d %d", &ab[i][0], &ab[i][1]);
        
//         i++;
//     }

//     qsort(ab, n, sizeof(int *), cmp);
    
//     i = 0;
//     count = 0;
//     int minEnd = ab[0][1], nextEnd, startK = 0;
//     while(minEnd != 1000000001) {
//         count++;
        
//         nextEnd = 1000000001;
//         for (int k = startK; k < n; k++) {
//             if (ab[k][0] >= minEnd && ab[k][1] < nextEnd) {
//                 nextEnd = ab[k][1];
//                 startK = k + 1;
//                 break;
//             }
//         }
        
//         minEnd = nextEnd;
//     }
//     for(i = 0; i < n; i++) {
//         free(ab[i]);
//     }
//     free(ab);
    
    printf("%d", count);
    
    return 0;
}




C++ 解法, 执行用时: 76ms, 内存消耗: 3576KB, 提交时间: 2022-04-01

#include<bits/stdc++.h>
using namespace std;

const int maxn = 2e5 + 10;
int n, ans;
struct node{
	int a;
	int b;
}h[maxn];
struct nodd{
	int aa;
	int bb;
}k[maxn];
bool cmp(node &x,node &y){
	return x.b < y.b;
}
int main(void){
    ios::sync_with_stdio(false);
    cin.tie(0);
	cin >> n;
	for(int i = 1; i <= n; i++) 
        cin >> h[i].a >> h[i].b;
	sort(h + 1, h + 1 + n, cmp); 
	int m = 0;
	for(int i = 1; i <= n; i++){
		if(i == 1){
			k[m].aa = h[i].a;
			k[m].bb = h[i].b;
			m++;
			ans++;
		}
		else if(h[i].a >= k[m-1].bb){
			ans++;
			k[m].aa = h[i].a;
			k[m].bb = h[i].b;
			m++;
        }
	}
	cout << ans << endl;
	return 0;
}

上一题