题目:https://abc103.contest.atcoder.jp/tasks/abc103_d
这题简单,只要把每个岛的左端与右端找到进行对比就行。
#include<stdio.h>
#include<string.h>
int a[100000+100];
int main(){
int n,m;
scanf("%d%d",&n,&m);
int minx=0;
memset(a,0,sizeof(a));
for(int i=1;i<=m;i++){ //把岛的左端和右端存起来
int x,y;
scanf("%d%d",&x,&y);
if(minx==0){
minx=x; //找最小到有争端的岛的左端
}
if(minx>x){
minx=x;
}
int min=a[x];
if(min==0){ //与上次有争端岛的右端进行比较存小的
a[x]=y;
}else if(min>y){
a[x]=y;
}
}
int flag=1;
int k=a[minx];
for(int i=1;i<=n;i++){
if(a[i]==0){
continue;
}
if(i>=k){ //比较岛的左端和上次争端的右端,比较;
flag++;
k=a[i];
}else if(k>a[i]){ //右端变小;
k=a[i];
}
}
printf("%d\n",flag);
return 0;
}
还不太懂的举个例子,比如一共有5个岛3个争端
1-5 1-3 3-4
只要把最小的存起来和下一个比较就好a[1]=3,a[3]=4;
1—2—3—4—5
只要断1-2 1-3,其中一个和3-4就好了