【清北前紧急补课6】饥饿的奶牛

题目描述

有一条奶牛冲出了围栏,来到了一处圣地(对于奶牛来说),上面用牛语写着一段文字。

现用汉语翻译为:

有N个区间,每个区间x,y表示提供的x~y共y-x+1堆优质牧草。你可以选择任意区间但不能有重复的部分。

对于奶牛来说,自然是吃的越多越好,然而奶牛智商有限,现在请你帮助他。

输入输出格式

输入格式:

第一行,N,如题

接下来N行,每行一个数x,y,如题

输出格式:

一个数,最多能吃到的牧草堆数

输入输出样例

输入样例#1:
复制

3
1 3
7 8
3 4

输出样例#1: 复制

5

说明

1<=n<=150000

0<=x<=y<=3000000

3000000的数据范围开始让我RE了一个点。能看出要用DP,就需要找一个状态转移方程。

我们用f[i]表示前i个区间中牛所能吃到的最多的牧草数。

用一个strcut来记录区间,其中 cow[].x记录区间的左端点,cow[].y记录区间的右端点。ans来记录牧草堆数(前缀和)

对于区间进行排序。

接下来我们找一个状态转移方程。

要使f[i]转移的条件就是找到一个j f[j]+y[j]-x[j]+1>f[j]

可以转化成

f[cow[j].y]=max(f[cow[j].y],f[cow[j].x-1]+cow[j].ans);

可以构成状态转移方程的条件是 该j点要在n之前,且该区间的左端点等于i

有以下代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=3000100;
int n;
int minn,sum;
int f[maxn];

struct c{
    int x,y;
    int a,b;
    int ans;
}cow[maxn];

bool cmp(c a,c b){
    return a.x==b.x?a.y<b.y:a.x<b.x;
}

int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>cow[i].x>>cow[i].y;
        cow[i].ans=cow[i].y-cow[i].x+1;
        minn=max(minn,cow[i].y);//寻找区间最右端
    }
    sort(cow+1,cow+n+1,cmp);
    int j=1;
    for(int i=0;i<=minn;i++){
        f[i]=max(f[i],f[i-1]);
        while(j<=n&&cow[j].x==i){
        f[cow[j].y]=max(f[cow[j].y],f[cow[j].x-1]+cow[j].ans);
        j++;
        }
        sum=max(f[i],sum);
    }
    cout<<sum;
}

原文地址:https://www.cnblogs.com/civilization-ga/p/9346721.html

时间: 2024-10-18 06:07:25

【清北前紧急补课6】饥饿的奶牛的相关文章

【清北前紧急补课12】粉刷匠

我是一个粉刷匠粉刷本领强~~要想看真正的粉刷匠 请进入这小哥哥的blog 嘻嘻嘻 题目描述 windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. 每个格子最多只能被粉刷一次. 如果windy只能粉刷 T 次,他最多能正确粉刷多少格子? 一个格子如果未被粉刷或者被粉刷错颜色,就算错误粉刷. 输入输出格式 输入格式: 第一行包含三个整数,N M T. 接下来有N行,每行一个长度为M的

【清北前紧急补课7】生日快乐

题目描述 windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕. 现在包括windy,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋糕. windy主刀,每一切只能平行于一块蛋糕的一边(任意一边),并且必须把这块蛋糕切成两块. 这样,要切成 N 块蛋糕,windy必须切 N-1 次. 为了使得每块蛋糕看起来漂亮,我们要求 N 块蛋糕的长边与短边的比值的最大值最小. 你能帮助windy求出这个比值么? 输入输出格式 输入格式: 三个整数,X

五一清北总结——day1+day2

五一清北学习总结 ——day1+day2 一.排序 1.快速排序 O(nlogn)的排序,用sort可以快速完成,但是可以被卡,手写sort利用随机数可以避免被卡掉. 代码: void quick_sort(int *a, int l, int r) { swap(a[l], a[rand()*rand() % (r -l + 1) +l]); int tmp = a[l]; int l_ = l, r_ = r; while (l < r) { while (l < r) { if (a[r

# 清北冬令营真题泛做

清北冬令营真题泛做 前言 这段时间为了准备冬令营把清北冬令营真题都做了一下.更个博回顾一下(免得你们老说我咕咕咕). 先写良心PKU的题再写THU的题, 主要是THU的题和PKU比起来真的毒瘤好多...... PKUWC2018 [PKUWC2018]Minimax 一个比较显然的暴力是归并排序,每次直接前后缀计算答案即可. 为啥不用线段树合并代替归并排序呢? 暴力线段树合并,合并的过程中顺便算一下即可,由于权值区间不交所以复杂度一个\(log\). [PKUWC2018]Slay the Sp

清北夏令营考试day1

清北夏令营考试day1 送分题(songfen) Time Limit:1000ms   Memory Limit:128MB 题目描述: LYK喜欢干一些有挑战的事,比如说求区间最大子段和.它知道这个题目有O(n)的做法.于是它想加强一下. 也就是说,LYK一开始有n个数,第i个数字是ai,它找来了一个新的数字P,并想将这n个数字中恰好一个数字替换成P.要求替换后的最大子段和尽可能大. LYK知道这个题目仍然很简单,于是就扔给大家来送分啦~ 注:最大子段和是指在n个数中选择一段区间[L,R](

清北学堂2017NOIP冬令营入学测试 P4744 A’s problem(a)

清北学堂2017NOIP冬令营入学测试 P4744 A's problem(a) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试题,每三天结算一次成绩.参与享优惠 描述 这是一道有背景的题目,小A也是一个有故事的人.但可惜的是这里纸张太小,小A无法把故事详细地说给大家听.可能小A自己也讲不清楚自己的故事,因为如果讲清了,也就没有这道题目了-- 小A的问题是这个样子,它找到了n份不同的工作,第i份工作每个月有ai的工资,每份工作需要小A每天

今我校——山东省著名高中——济南市历城区第二中学《清北学子经验交流会》感悟

放飞梦想,一起成长--历城二中清北学子经验交流会于今日9时在行政楼会议室隆重召开. 与会领导有:济南市教育局宣传科科长.高中部李矿水副校长.高三级部级部主任暨高中部副校长田庆民校长.全国生物奥赛金牌暨清华大学预录取的任雨同学.化学奥赛全国金牌被清华大学降至一本线录取的两位学长.数学奥赛被清华大学降至一本线录取的一位学长以及来自五湖四海的媒体朋友们,会议开场对他们的到来表达了热烈的欢迎.

清北押题班(1)

清北押题冲刺班Text1 T1 Count 问有几个无序二元组 $ (x ?, ?y) $ 满足 $ xy \equiv 1?(mod?P ) $ , $ 0 \leq x < P?, ?0 \leq y <P $ 解题思路: 你没看错,这是day1的T1,一道赤裸裸的数学题. Subtask 1:枚举 $ O(P^2) $ 个二元组,选出符合条件的,再去重: Subtask 2:可以发现模 $ P $ 意义下,一个数 x 有逆元,当且仅当 $ gcd(x, P) = 1 $ .并且如果 $

铁轨 清北学堂 线段树

铁轨 清北学堂 线段树 [题目描述] R 国的铁轨经常会进行重新修建. R 国是一个细长的国家,一共有 n 个城市排成一排,首都位于 1 号城市,相邻两个城市之间有铁路相连. 每次新建铁轨的时候,一定是从首都开始修建,直到某一个城市为止,这其间的铁路都会变成新版本的设 施,而旧设施会被拆除.然而,由于 R 国的工程师脑子不太好使,任意两种不同版本的铁路之间都无法连 接,因此必须要进行换乘. 现在给出你修建铁轨的操作,小 R 时不时第会想问你,如果在第 x 个城市到第 y 个城市之间随机选择一个