vijos p1103校门外的树 和 P1165火烧赤壁

来源:互联网 发布:ug制图软件 编辑:程序博客网 时间:2024/04/27 00:55

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;}