p1103校门外的树,模拟出每一棵树,每段给定的长度就代表移走数就可以了。
#include<iostream>
using namespace std;
const int N=10005;
int a[N];
int main(){
int m,l,i,head,tail,ans=0;
cin>>l>>m;
for(i=0;i<=l;i++)a[i]=1;
for(i=0;i<m;i++)
{
cin>>head>>tail;
for(;head<=tail;head++) a[head]=0;
}
for(i=0;i<=l;i++)
if(a[i]==1)ans++;
cout<<ans;
return 0;
}
P1165火烧赤壁,由于数据给的间隔非常之大,无法开出那么大的数组,所以就没法像P1103那样做。不同的线段组按左端从左向右排序,然后相邻的线段之间去重就可以了。之后统计right-left之和就是答案。
#include <cstdio>
#include <algorithm>
using namespace std;
struct node{
long left,right;
}chuan[20000];
bool operator<(const node &x,const node &y){return x.left<y.left;}
int main()
{
long i,n;
scanf("%ld",&n);
for(i=0;i<n;i++)
scanf("%ld %ld",&chuan[i].left,&chuan[i].right);
sort(chuan,chuan+n);
for(i=0;i<n-1;i++)
{
if(chuan[i].right>=chuan[i+1].left)
{
if(chuan[i].right>chuan[i+1].right)
chuan[i+1].right=chuan[i].right;
chuan[i].right=chuan[i+1].left;
}
}
long ans=0;
for(i=0;i<n;i++)
ans+=chuan[i].right-chuan[i].left;
printf("%ld", ans);
return 0;
}