zoukankan      html  css  js  c++  java
  • nyoj51-管闲事的小明

    管闲事的小明

    时间限制:4000 ms  |  内存限制:65535 KB
    难度:2
    描述
    某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
      由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。  已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。聪明的小明干了一件又一件事,他觉得这个很有意思,就想用计算机来帮助建筑工人统计这些树,现在任务来了,计算将这些树都移走后,马路上还有多少棵树。
    输入
    第一行是一个整数N表示有N组测试数据(1<=N<=100)
    每组测试数据的第一行有两个整数:L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。


    输出
    输出包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。

    样例输入
    1
    500 3
    150 300
    100 200
    470 471
    样例输出
    298

    我自己的代码(C),可通过

    #include<stdio.h>
    int main()
    {
    	int n,c[10000];
    	scanf("%d",&n);
    	while(n--)
    	{
    		int l,m,a,b,i,j=0;
    		scanf("%d%d",&l,&m);
    		for(i=0;i<=10000;i++)
    		c[i]=1;
    		while(m--)
    		{
    		scanf("%d%d",&a,&b);
    		for(i=a;i<=b;i++)
    		c[i]=0;}
    		for(i=0;i<=l;i++)
    		if(c[i])
    		j++;
    		printf("%d
    ",j);
    	}
    }
    最优程序如下(C++):
     
    #include<iostream>
    #include<numeric>
    #include<vector>
    using namespace std;
    int main()
    {
    	int n,beg,end,L,M;
    	cin>>n;
    	
    	while(n--)
    	{
    		cin>>L>>M;
    		vector<bool> have(L+1,true);
    		while(M--)
    		{
    			cin>>beg>>end;
    			for(int i=beg;i<=end;i++)
    				have[i]=false;
    		}
    	//	cerr<<100-n<<endl;
    		cout<<accumulate(have.begin(),have.end(),0)<<endl;
    	}
    	
    }        

  • 相关阅读:
    第0次作业
    第4次作业
    第3次作业
    第2次作业
    C#浮点数保留位数
    第0次作业
    软件工程第4次作业
    软件工程第3次作业
    软件工程第2次作业
    软件工程第1次作业
  • 原文地址:https://www.cnblogs.com/aerer/p/9931136.html
Copyright © 2011-2022 走看看