区间贪心

 

51nod 1091 线段的重叠

#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e4+5;
struct node{
    int l,r;
}a[maxn];
bool cmp(node a,node b){
    if(a.l==b.l) return a.r>b.r;
    return a.l<b.l;
}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d%d",&a[i].l,&a[i].r);
    }
    sort(a+1,a+1+n,cmp);
    int x,y,ans = 0;
    node pre=a[1];
    for(int i=2;i<=n;i++){
        if(a[i].r<=pre.r) {
            ans = max(ans,a[i].r-a[i].l);
        }
        else{
            ans = max(ans,pre.r-a[i].l);
            pre = a[i];
        }
    }
    printf("%d\n",ans);
    return 0;
}

51nod 1133 不重叠的线段

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll setoff = 1e9;
const int maxn = 5e4+5;
struct node{
    ll l,r;
}a[maxn];
bool cmp(node a,node b){
    if(a.r==b.r) return a.l<b.r;
    return a.r<b.r;
}
int main(){
    int n,x,y;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) {
        scanf("%lld%lld",&a[i].l,&a[i].r);
        a[i].l+=setoff,a[i].r+=setoff;
    }

    sort(a+1,a+1+n,cmp);
    int ans = 0,end = 0;
    for(int i=1;i<=n;i++){
        if(a[i].l>=end){
            ans++;
            end = a[i].r;
        }
    }
    printf("%d\n",ans);
    return 0;
}

POJ 1089 Intervals

误以为a[n].r是最大的r

#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll setoff = 1e9;
const int maxn = 5e4+5;
struct node{
    int l,r;
}a[maxn];
bool cmp(node a,node b){
    if(a.l==b.l) return a.r<b.r;
    return a.l<b.l;
}
int main(){
    //freopen("in.txt","r",stdin);
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d%d",&a[i].l,&a[i].r);
    sort(a+1,a+1+n,cmp);
    int mx = a[1].r;
    printf("%d ",a[1].l);
    for(int i=2;i<=n;i++){
        if(a[i].l > mx)
            printf("%d\n%d ",mx,a[i].l);
        mx = max(mx,a[i].r);
    }
    printf("%d\n",mx);
    return 0;
}

 

POJ1752 Advertisement 贪心区间选点问题

#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 1e3+5;
const int setoff = 1e4;

struct node{
    int l,r;
}a[maxn];
bool cmp(node a,node b){
    return a.r < b.r;
}
bool vis[30000];
vector<int> res;

int ans;
int main(){
    int n,k;
    scanf("%d%d",&k,&n);
    for(int i=0;i<n;i++){
        scanf("%d%d",&a[i].l,&a[i].r);
        a[i].l += setoff;
        a[i].r += setoff;
        if(a[i].l > a[i].r) swap(a[i].l,a[i].r);
    }
    sort(a,a+n,cmp);

    for(int i=0;i<n;i++){
        if(a[i].r-a[i].l+1 <= k){
            for(int j=a[i].l;j<=a[i].r;j++){
                if(vis[j]==0){
                    ans++;
                    vis[j]=1;
                    res.push_back(j);
                }
            }
        }
        else {
            int cnt=0;
            for(int j=a[i].l;j<=a[i].r;j++){
                if(vis[j]==1) cnt++;
            }
            if(cnt>=k) continue;
            for(int j=a[i].r;j>=a[i].l;j--){
                if(vis[j]==0){
                    ans++;
                    cnt++;
                    vis[j]=1;
                    res.push_back(j);
                    if(cnt>=k) break;
                }
            }
        }
    }
    printf("%d\n",ans);
    sort(res.begin(),res.end());
    for(auto it : res){
        printf("%d\n",it-setoff);
    }

    return 0;
}

 

 

 

 

 

也可以 离散化+差分约束

POJ 1201 Intervals

也可 差分约束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值