第一行输入两个整数
,用空格隔开,表示马路的长度和地铁施工区域数,满足
,
。
接下来
行,每行输入两个整数
,用空格隔开,表示第
个施工区域的起始点和终止点的坐标,满足
。
输出一个整数,表示移除所有施工区域内(包括端点)树后,剩余的树的总棵树数。
500 3 150 300 100 200 470 471
298
马路上共有棵树。施工区域 [150,300] 中含有
棵,[100,200] 中含有
棵,[470,471] 中含有
棵。三个区域的重叠部分 [150,200] 有
棵被重复移除,所以实际移除的树数为
,因此剩余
棵。
10 2 2 5 4 8
4
马路上共有棵树。区域 [2,5] 移除
棵,区域 [4,8] 移除
棵。重叠部分 [4,5] 有
棵被重复移除,所以实际移除
棵,剩余
棵。
l,m = map(int,input().strip().split()) regin = [] for _ in range(m): a,b = map(int,input().strip().split()) regin.append((a,b)) totals = l +1 remove_trees = overlaps = 0 removed = [False] * (l+1) for (a,b) in regin: for i in range(a,b+1): if not removed[i]: remove_trees += 1 removed[i] = True else: overlaps += 1 remain = totals - remove_trees print(remain)
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 注意 hasNext 和 hasNextLine 的区别 int L = in.nextInt(), M = in.nextInt(); StringBuffer sb = new StringBuffer(); sb.setLength(L+1); for (int n=0; n<M; n++) { int l = in.nextInt(), r = in.nextInt(); for (int t=l; t<=r; t++) { sb.setCharAt(t, '0'); } } System.out.println(sb.toString().replaceAll("0", "").length()); } }依旧StringBuffer
#include <iostream> #include <iterator> #include <vector> using namespace std; int main() { int l,m; cin >> l >> m; vector<bool>tree(l+1,true); while(m--){ int beginnum,endnum; cin >> beginnum >> endnum; //完全的笨办法,把所有给出的区间都置0 for(;beginnum <= endnum;beginnum++){ tree[beginnum] = false; } } //然后统计剩下了多少1 int count = 0; for(int i = 0 ; i <= l ; i++){ if(tree[i])count++; } cout << count <<endl; return 0; }
#include <stdio.h> void shu(int a[],int l,int r,int L) { for(int i=0;i<=L;i++) { if(i>=l&&i<=r) { a[i]=1; } } } int main() { int L,M; scanf("%d%d",&L,&M); int a[10000]={0}; int n=M; for(int i=0;i<n;i++) { int l,r; scanf("%d%d",&l,&r); shu(a,l,r,L); } int hen=0; for(int i=0;i<=L;i++) { if(a[i]==0) { hen++; } } printf("%d",hen); }