首页 > 其他分享 >题解 SP18965

题解 SP18965

时间:2022-11-30 09:24:03浏览次数:38  
标签:牛奶 int 题解 ans leq 时间 SP18965 贪心

题解 SP18965

题目大意:

奶牛很厌烦等待,奶牛i 在它的截止时间 $d_i( 1 \leq d_i \leq 10,000 ) $前挤 \(g(1\leq g_i\leq 1000)\)的奶,否则将不能挤奶。时间 t 开始时为 0 ,即在时间 \(t=x\) 时,最多可以挤 x 头奶牛。

这个题目稍微读一下就会发现是一个贪心题

但是这个贪心思想应该怎么想呢?

首先,我们知道, 1 头奶牛,在 \(d_i\) 时间前都可以进行挤奶,这一点非常重要,这决定着两种不同的贪心策略,详情见后文

其次在同一时间,我们肯定是取最大值的,所以先对这里的 \(g_i\) 进行排序

接下来就是思考一下怎样才能取得在时限内,取得最大的牛奶价值呢?

我们已经按照价值由大到小排过序了,所以直接枚举 \([1,n]\) 内所有的牛奶即可

但是,我们还是没有触及到这道题的贪心策略

  • 我们可以考虑,在当前时间,我们能得到的最大牛奶价值,这个最大值可以在输入时,直接将当前时间的桶存为当前时间的最大值

  • 但是,这显然是错的,因为这里我们的牛奶价值,是可以在 \([1,d_i]\) 所有时间内获得的

  • 单凭一个时间节点的值肯定是不行的,所以这是个错误的做法

下面我们来看一下正解

因为上面说过,牛奶在 \([1,d_i]\) 的区间内所有时间内都可以进行获取

所以,我们每次考虑,当前枚举到的时间之前有没有可以获取第 i 个牛奶的时间点

所以,我们的内层循环可以直接从当前枚举到的牛奶的时间往前扫一遍,如果有时间点并未被占用

我们就在此时间点进行第 i 个牛奶的获取,并且为此时间点打上标记

最终输出 ans 即可

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int N=2e5+10;
int n,tot,ans;
struct node{
	int x,y;
}a[N];
int v[N],vis[N];
bool operator < (const node l,const node r){
	return l.x>r.x;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d",&a[i].x,&a[i].y);
	}
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++){
		for(int j=a[i].y;j>=1;j--){
			if(vis[j]==0){
				vis[j]=1;
				ans+=a[i].x;
				break;
			}
		}
	}
	printf("%d",ans);
	return 0;
}

标签:牛奶,int,题解,ans,leq,时间,SP18965,贪心
From: https://www.cnblogs.com/Tyrue-blog/p/16937402.html

相关文章

  • 题解 CF518B
    题解CF518B这个题最暴力的做法就是对于每个\(s_i\)都在b字符串里扫一遍但是\(s.len\leq2\times10^5\)所以肯定过不了但是我们思考一下,这里的字母对应其实可以......
  • 题解 CF1719A
    题解CF1719A这个题判断\(n+m\)的奇偶性就可以了。奇数输出Burenka,偶数输出Tonya。#include<cstdio>#include<iostream>#include<cmath>#include<algorithm>......
  • 题解 CF1716B
    题解CF1716B这是一个纯纯的构造题我们要构造n个序列,每个序列他的元素\(a_i\)在第i个位置上的数量都应该比上一个序列的数量并且这种序列只能通过交换两个数字来......
  • 题解 CF1091C
    题解CF1091C这个题乍一看,好像有点像约瑟夫问题,但是写完了之后会发现,就会发现TLE了因为\(n\le10^9\),而且用约瑟夫问题写的话每次都会跳k步,肯定会超时超时代码这里......
  • 题解 CF1080B
    题解CF1080B莫名就卡到了最优解第一,但是代码又长又臭,很明显我代码实现能力太弱了。。。直接开始讲,我都不知道怎么讲分情况讨论如果\(l=r\):我们只需要考虑这个位置......
  • 题解 CF1253B
    题解CF1253B这个题是一个模拟题只需要注意几点:1.同一天同一个人只能进入一次2.同一天同一个人只能出去一次3.一天中一个人没进来就不能出去然后我们用vis数组......
  • 题解 CF1711B
    题解CF1711B这个题说明了,蛋糕的个数只跟好友的对数有关,跟去的人或者是单个的人的个数是无关的(是不是单个的人去没有蛋糕吃)所以我们就要考虑,怎样才能满足吃掉的蛋糕正好......
  • 题解 CF1740D
    CF1740D这个题说实话比\(C\)题要好想/jk,但是我没有在考场上写出来,写出来了但是没交上这个题只需要记录一下终点当前时刻,需要放置下标的棋子(姑且叫它棋子),以及当前棋盘上......
  • Codeforces Round #836 (Div. 2) A-D题解
    比赛链接A、SSeeeeiinnggDDoouubbllee一个字符串的每个字母翻倍,且没有其他限制。所以把字符串正着输一遍,再倒叙输出一遍即可。点击查看代码#include<bits/stdc++.h>......
  • 【题解】 P8287 「DAOI R1」Flame
    题面传送门解决思路本题解是对这篇题解部分内容的补充,讨论的是两种\(\mathcal{O(m\logn)}\)的做法。大体思路都是一样的,先预处理出每一条边需要多少时间后才能连......