列表

详情


NC215158. 撸起袖子搬电脑!

描述

南宁师范大学校内的机房里有一些电脑,每两个相邻的电脑之间的间隔都是1米。我们可以把机房看成一个数轴,机房的两端分别在0和L的位置;数轴上的每个整数点,即0,1,2,…L,都有一台电脑。 由于经常来上机的同学比较少,所以机房老大要搬走一些区域的电脑。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的电脑(包括区域端点处的两台电脑)搬走。你的任务是计算将这些电脑都搬走后,机房上还有多少台电脑。

输入描述

第一行有2个整数L和M,L代表机房的长度,M代表区域的数目,L和M之间用一个空格隔开。 接下来的M行每行包含2个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标

输出描述

1个整数,代表机房还剩多少台电脑

示例1

输入:

500 3
150 300
100 200
470 471

输出:

298

说明:

对于所有的数据,1≤L≤100000000
对于10%的数据,1<=M<=100
对于20%的数据,1<=M<=1000
对于50%的数据,1<=M<=100000
对于100%的数据,1<=M<=1000000

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Java(javac 1.8) 解法, 执行用时: 581ms, 内存消耗: 426324K, 提交时间: 2020-12-20 14:44:03

import java.util.*;
import java.math.*;
public class Main {
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        int L = input.nextInt();
        int M = input.nextInt();
        int sum[] = new int[L+2];
        for(int i=0;i<M;i++)
        {
            int l = input.nextInt();
            int r = input.nextInt();
            sum[l]++;
            sum[r+1]--;
        }
        long ans=0,anss=0;
        for(int i=0;i<=L;i++)
        {
            ans+=sum[i];
            if(ans==0)
                anss++;
        }
        System.out.println(anss);

    }
}

Python3(3.9) 解法, 执行用时: 32ms, 内存消耗: 2844K, 提交时间: 2020-12-20 16:11:07

answer=[]
a,n=map(int,input().split())
b1=0
b2=-1
c1=0
c2=-1
a1,a2=map(int,input().split())
for i in range (n-1):
    a3, a4 = map(int, input().split())
    if(a3<=a1 and a4>=a2):
        a1=a3
        a2=a4
    if(a3<a1 and a4<a2 and a4>a1):
        a1=a3
    if(a3>a1 and a3<a2 and a4>a2):
        a2=a4
    if(a3>a2):
        b1=a3
        b2=a4
    if(a4<a1):
        c1=a3
        c2=a4
print(a-(a2-a1+1)-(b2-b1+1)-(c2-c1+1)+1)

C++(clang++11) 解法, 执行用时: 102ms, 内存消耗: 1144K, 提交时间: 2020-12-22 21:27:15

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

int pc[100000000+5];

int main()
{
	int L,M;
	cin>>L>>M;
	for(int i=0;i<M;i++)
	{
		int l,r;
		scanf("%d %d",&l,&r);
		pc[l]++;
		pc[r+1]--;
	}
	int ans = 0;
	int flag = 0;
	for(int i=0;i<=L;i++)
	{
		flag += pc[i];
		if(!flag)
			ans++;
	}
	cout<<ans<<endl;
	return 0;
}

上一题