有1,2,3....n个数组,每个数组包含一系列一维线段的表示,每个数组的元素结构为(point,length)(point>=0 且 length>=1,都为整数),表示从point开始长为length的线段,现将n个数组中的线段合并,其中需要考虑数组的优先级:1>2>....>n,高优先级的数组的线段将覆盖并切分重叠的低优先级数组线段。求合并后的数组?
示例:
1数组:(0,2),(6,9)
2数组:(1,3),(7,10)
合并后:(0,2),(2,2),(6,9),(15,2)
输入:
n(数组个数)
依次输入n个数组。
输出:
合并后的数组。
我的想法其实很简单,从第n个数组,往前。一段一段合并。合并过程是:在给定区间中遍历,遇到已经存在的区间边界,进行切分或者覆盖。这个方法的缺点是如果区间很大比如1,100000 就需要循环10万次。所以我做了离散化。这样就ok了。
之前尝试用过set来解决,发现并不可以。
// // main.cpp // test2 // // Created by 小康 on 28/03/2018. // Copyright © 2018 小康. All rights reserved. // #include <iostream> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <map> #include <algorithm> #include <set> using namespace std; struct Node { int point; int length; int end; bool operator <(const Node &r) const { if(point == r.point) return end<r.end; else return point<r.point; } Node(){} Node(int point,int end) { this->point=point; this->end=end; this->length = end-point+1; } }a[105][105],res[1005]; set<Node> ans; bool sort(Node a,Node b) { if(a.point==b.point) return a.end<b.end; else return a.point<b.point; } int b[105]; int n; map<int,int> m; int c[10005]; int main() { printf("请输入数组的个数 "); scanf("%d",&n); int p=1; for(int i=0;i<n;i++) { printf("请输入第%d个数组的个数 ",i+1); scanf("%d",&b[i]); printf("请依次输入point,length "); for(int j=0;j<b[i];j++) { scanf("%d%d",&a[i][j].point,&a[i][j].length); a[i][j].end=a[i][j].point+a[i][j].length-1; c[++p]=a[i][j].point; c[++p]=a[i][j].end; } } sort(c+1,c+p+1); for(int i=1;i<=p;i++) { m[c[i]]=i; } int tagl[10005]; int tagr[10005]; int tag[10005]; memset(tagl,0,sizeof(tagl)); memset(tagr,0,sizeof(tagr)); memset(tag,0,sizeof(tag)); int q=1; for(int i=n-1;i>=0;i--) { for(int j=0;j<b[i];j++) { int l=m[a[i][j].point]; int r=m[a[i][j].end]; for(int k=l;k<r;k++) { if(tagl[k]!=0) { if(tagl[k]>r) { tagl[r]=tagl[k]; tagr[tagl[k]]=r; tagl[k]=0; } else { tagr[tagl[k]]=0; tagl[k]=0; } } if(tagr[k]!=0) { if(tagr[k]<l) { tagl[tagr[k]]=l; tagr[l]=tagr[k]; tagr[k]=0; } else { tagl[tagr[k]]=0; tagr[k]=0; } } } tagl[l]=r; tagr[r]=l; } } printf("结果是: "); int pre=0; for(int i=1;i<=p;i++) { if(tagl[i]!=0) { if(i==pre&&pre!=0) printf("(%d,%d) ",c[i]+1,c[tagl[i]]-c[i]); else printf("(%d,%d) ",c[i],c[tagl[i]]-c[i]+1); pre=tagl[i]; } } return 0; }
我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=1mixekxljlo4b