首页 > 其他分享 >B. Buying gifts[贪心]

B. Buying gifts[贪心]

时间:2023-09-01 21:35:28浏览次数:41  
标签:node 贪心 return int gifts include 人买 Buying 礼物

Problem - 1801B - Codeforces

题意是需要给两个人买礼物,有n个商店,每个商店只能给一个人买,而且每个商店给两个人买的礼物的价钱也可能不同,问给两人买的礼物的最大价格之差最小是多少。

我们考虑这种情况。如果当前给b买的礼物最大值为x,那么那些商店里给b礼物价格小于等于x的我们完全可以都买给b,或者部分买给a如果有最优解的话。

既然这样我们按照b的增序进行排序。枚举每一个b。假设此时后面的都买给a(此处类似昨晚D的题解),前面的部分也可以买给a。那么我们就需要搞个后i项最大值。和前i项最接近b的。后面用数组,前面用set维护即可。

注意有些小坑点。

查看代码

#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
typedef long long ll;
ll n;
struct node
{
	int a,b;
}c[500005];
int f[500005];
void solve()
{
	cin>>n;
	int ans=0x7f7f7f7f;
	for(int i=1;i<=n;i++)
		cin>>c[i].a>>c[i].b;
	sort(c+1,c+1+n,[&](node x,node y)->bool{
		if(x.b==y.b)return x.a>y.a;
		return x.b<y.b;
	});
	f[n+1]=0;//这里不加wrong2
	for(int i=n;i>0;i--)
		f[i]=max(c[i].a,f[i+1]);
	set<int>cc;
	for(int i=1;i<=n;i++)
	{
		if(i<n)//这里不加会wrong69
		ans=min(ans,abs(c[i].b-f[i+1]));
		auto it=cc.lower_bound(c[i].b);
		if(it!=cc.end())ans=min(ans,abs(max(*it,f[i+1])-c[i].b));//注意前面最接近b的不一定是a的最大值
		if(it!=cc.begin())--it,ans=min(ans,abs(max(*it,f[i+1])-c[i].b));
		cc.insert(c[i].a);
	}
	cout<<ans<<"\n";
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin>>t;
	while(t--)solve();
	return 0;
}

标签:node,贪心,return,int,gifts,include,人买,Buying,礼物
From: https://www.cnblogs.com/qbning/p/17672871.html

相关文章

  • 贪心算法-Huffman树
    贪心算法-Huffman树1.哈并果子问题的概述及案例https://www.acwing.com/problem/content/150/上图为本问题的案例。实际上,本题就是霍夫曼树的应用。关于霍夫曼树的定义,这里就不再赘述。根据上图,实际上这道题就是在询问:将所有的果子堆进行合并,构造成一......
  • 【CF1374E1】Reading Books (easy version)(贪心)
    题目大意:给出\(n(1\len\le2\times10^{5})\)个三元组\((t,a,b)(0\lea,b\le1)\),选出其中任意个,使得被选中的元素\(a\)、\(b\)的总和均为\(k\),求\(t\)总和的最小值因为被选中的元素\(a\)、\(b\)的总和均为\(k\),所以被选中的三元组中,形式为\((t,1,0)\)和\((t,0,1)\)的数量相等......
  • 贪心笔记
    本文主要以例题讲解和贪心方法入手。邻项交换当我们确定操作顺序,并按照题意模拟即可得出答案,就要用邻项交换的办法来确定最优的操作顺序。接水问题对于一个排队顺序\(T_1\simT_n\),答案显然等于:\[\frac{\sum_{i=1}^{n}{(n-i)\timesT_i}}{n}\]那么将其中的\(T_2,T_3\)......
  • [代码随想录]Day30-贪心算法part04
    题目:860.柠檬水找零思路:收到钱三种情况:5刀:直接收起来就可以了,不需要找钱10刀:收到10刀,需要找5刀,如果没有5刀,就返回false,否则5刀-120刀:收到20刀(但是没用,找钱也不能找20所以不需要记录数量),优先考虑找105,因为10只能在这里用,其次再考虑找555代码:funclemonadeChange(bil......
  • [代码随想录]Day29-贪心算法part03
    题目:1005.K次取反后最大化的数组和思路:思路是:先把负数从小到大变成正数(即绝对值由大到小)如果还需要变化(k>0),就变化最小的数在第一步变化的同时顺便记录一个数组和,那么结束之后会有三种情况:k==0;也就是说负数的个数大于等于k,直接返回结果k%2==0;此时全是正整数,......
  • Codeforces Round 887 (Div. 1)C. Ina of the Mountain(数据结构,反悔贪心)
    题目链接:https://codeforces.com/problemset/problem/1852/C 题意: 给定一个长度为n的序列和正整数k; 每次可以选取任意一个区间,将区间内每个数减1; 如果出现一个数变成0,那么那个数变成k; 问至少操作多少次可以使得每个数变成k; 分析: 将每个数值抽象为对应高度的......
  • hdu:田忌赛马(贪心,双指针)
    ProblemDescription“田忌赛马”是中国历史上一个著名的故事。大约2300年前,齐国大将田忌喜欢和国王赛马,并且约定:每赢一场,对方就要付200元。假设已知田忌和国王的各自马匹的速度都不相同,请计算田忌最好的结果是什么。Input输入包含多组测试样例。每组样例的第一行是一个整数......
  • hdu:老鼠和猫的交易(贪心)
    ProblemDescription小老鼠准备了M磅的猫粮,准备去和看守仓库的猫做交易,因为仓库里有小老鼠喜欢吃的五香豆。仓库有N个房间;第i个房间有J[i]磅的五香豆,并且需要用F[i]磅的猫粮去交换;老鼠不必交换该房间所有的五香豆,换句话说,它可以用F[i]a%磅的猫粮去换取J[i]a%磅的五香豆,其......
  • [代码随想录]Day27-贪心算法part01
    题目:455.分发饼干思路:贪心,思路是尽量先给胃口值小的分,饼干也是从小的开始分:如果饼干满足了胃口值,结果+1换下一个人,下一个饼干如果饼干满足不了胃口值,换下一个饼干(满足不了胃口值小的一定满足不了大的)代码:funcfindContentChildren(g[]int,s[]int)int{res:=......
  • POJ31900(贪心)
    想对了一半,还是不扎实原本想将初始化和之后处理一起放到for里面的(i.e.将push,ans=1等放到for里面),发现比较麻烦,然后死磕这个,要建函数什么的,看了人家的代码之后发现没有必要,当然是美观了一点。其实能不能将初始化和处理一起写最重要的是看你的思路isclearornot,sometimesi......