背包

news/2024/11/28 6:50:26/

Applese有1个容量为v的背包,有n个物品,每一个物品有一个价值ai,以及一个大小bi
然后他对此提出了自己的疑问,如果我不要装的物品装的价值最大,只是一定需要装m个物品,要使得求出来的物品价值的中位数最大
Applese觉得这个题依然太菜,于是他把这个问题丢给了你
当物品数量为偶数时,中位数即中间两个物品的价值的平均值
输入描述:
第一行三个数v, n, m,分别代表背包容量,物品数量以及需要取出的物品数量
接下来n行,每行两个数ai,bi,分别代表物品价值以及大小
n ≤ 1e5, 1 ≤ m ≤ n, ai ≤ 1e9, v ≤ 1e9, bi ≤ v

输出描述:
仅一行,代表最大的中位数
示例1
输入
20 5 3
3 5
5 6
8 7
10 6
15 10
输出
8

#include<bits/stdc++.h>
using namespace std;typedef long long s64;
#define rep(i,l,r) for(int i=l;i<=r;++i)
#define per(i,r,l) for(int i=r;i>=l;--i)
#define gc (c=getchar())
int read()
{char c;while(gc<'0');int x=c-'0';while(gc>='0')x=x*10+c-'0';return x;
}
const int N=5e6+5,U=1<<15;
int cnt[U];
int n,a[N],b[N],qa[N],qb[N];
int idb[N];
bool mark[N];
s64 s1[N],s2[N];int q1[N];
void get(int q[],int a[])
{rep(i,0,U-1)cnt[i]=0;rep(i,1,n)++cnt[a[i]%U];rep(i,1,U-1)cnt[i]+=cnt[i-1];per(i,n,1)q1[cnt[a[i]%U]--]=i;rep(i,0,U-1)cnt[i]=0;rep(i,1,n)++cnt[a[i]/U];rep(i,1,U-1)cnt[i]+=cnt[i-1];per(i,n,1)q[cnt[a[q1[i]]/U]--]=q1[i];
}
s64 sum;int tail;
void del(int x)
{mark[x]=1;if(x<=tail){sum-=b[qb[x]];while(++tail,mark[tail]);sum+=b[qb[tail]];}
} int k;
void init_s()
{rep(i,1,n)idb[qb[i]]=i;sum=0;rep(i,1,k)sum+=b[qb[i]];s64 sum0=sum;tail=k;s2[1]=sum;rep(i,2,n-k+1){del(idb[qa[i-1]]);s2[i]=sum;}sum=sum0;tail=k;rep(i,1,n)mark[i]=0;s1[n]=sum;per(i,n-1,k){del(idb[qa[i+1]]);s1[i]=sum;}
}int main()
{//freopen("1.in","r",stdin);int v=read();n=read();int m=read();rep(i,1,n){a[i]=read();b[i]=read();}get(qa,a);get(qb,b);k=m/2;	init_s();if(m%2){per(i,n-k,1)if(s1[i-1]+b[qa[i]]+s2[i+1]<=v){cout<<a[qa[i]];break;}}else{per(i,n-k,1)if(s1[i]+s2[i+1]<=v){cout<<(a[qa[i]]+a[qa[i+1]])/2;break;	}}
}

http://www.ppmy.cn/news/141160.html

相关文章

python 包

包 定义&#xff1a; 为了组织好模块&#xff0c;会将多个模块分为包。Python 处理包也是相当方便的。简单来说&#xff0c;包就是文件夹&#xff0c;但该文件夹下必须存在 __init__.py 文件。 常见的包结构如下&#xff1a; 最简单的情况下&#xff0c;只需要一个空的 __init…

手提电脑如何截图?

怎么能用到手提电脑上的prtsc键截图&#xff1f; 怎么能用到手提电脑上的prtsc键&#xff1f;我的prtsc键与insert一起&#xff0c; 一个键上标了prtsc与insert&#xff0c;prtsc写在键的下部分&#xff0c;在insert的下面。 要实现prtsc键的功能很简单&#xff0c;按住本本上的…

随身计算机的硬盘是该换了,手提电脑硬盘可以换吗

硬盘有固态硬盘(SSD 盘,新式硬盘)、机械硬盘(HDD 传统硬盘)、混合硬盘(HHD 一块基于传统机械硬盘诞生出来的新硬盘)。下面是学习啦小编带来的关于手提电脑硬盘可以换吗的内容,欢迎阅读! 手提电脑硬盘可以换吗? 首先硬盘一点,只要你电脑里用的是硬盘就可以换。 现在的笔记本…

包包,我的包包。。

可爱的星座MM永远都缺一件衣服&#xff0c;一双鞋子&#xff0c;一支口红&#xff0c;当然&#xff0c;也缺一个可爱的包包。下面来看看为大家苦心搜罗的各种包包&#xff0c;希望可以清凉各位的眼球&#xff0c;暂时弥补空缺哦。 白羊座 适合白羊MM的包包 温暖的针织包包。纯净…

python包_Python包

python包 Today we are going to learn about Python Package. Before proceeding to this tutorial you should have knowledge about Python Modules which you can find it here. 今天&#xff0c;我们将学习Python包。 在继续本教程之前&#xff0c;您应该了解有关Python模…

Pytorch入门(三)深度学习模型的训练的基本步骤

文章目录 一、修改现有的网络模型二、模型的保存三、模型的加载四、模型的评估五、训练模型的完整套路六、使用GPU加速模型的训练七、模型训练完整的验证套路 一、修改现有的网络模型 import torchvision from torch import nn # pretrained 为True时会自动下载模型所对应的权…

为便于管理大型软件系统中数目众多的类&#xff0c;解决类的命名冲突问题&#xff0c;java引入包&#xff08;package&#xff09;机制&#xff0c; 提供类的多重类命名空间。 package语句作为java源文件的第一条语句&#xff0c;指明该文件中定义的类所在的包。若缺省&#x…

最佳Android系统 | 运行在台式机、笔记本手提电脑的安卓Android系统

最佳Android系统 | 运行在台式机、笔记本手提电脑的安卓Android系统 适用于PC 2019的最佳Android操作系统 2022年2月1日 团队技术探索 Android 您是否知道&#xff0c;即使有几个升级版本&#xff0c;如Windows 10和10.1&#xff0c;即使这样&#xff0c;Android应用程序也在…