POJ3111 K Best
Description:
Demy has n jewels. Each of her jewels has some value vi and weight wi.
Since her husband John got broke after recent financial crises, Demy has decided to sell some jewels. She has decided that she would keep k best jewels for herself. She decided to keep such jewels that their specific value is as large as possible. That is, denote the specific value of some set of jewels S = {i1, i2, …, ik} as
s(S) = \frac{\sum_{j=1}^k v_{ij}}{\sum_{j=1}^kw_{ij}}$$.
Demy would like to select such k jewels that their specific value is maximal possible. Help her to do so.
## Analysis:
不妨令
$$ \frac{\sum_{j=1}^k v_{ij}}{\sum_{j=1}^kw_{ij}} \geq xs(S) = \frac{\sum_{j=1}^k v_{ij}}{\sum_{j=1}^kw_{ij}}$$.
Demy would like to select such k jewels that their specific value is maximal possible. Help her to do so.
## Analysis:
不妨令
$$ \frac{\sum_{j=1}^k v_{ij}}{\sum_{j=1}^kw_{ij}} \geq x
Demy would like to select such k jewels that their specific value is maximal possible. Help her to do so.
## Analysis:
不妨令
$$ \frac{\sum_{j=1}^k v_{ij}}{\sum_{j=1}^kw_{ij}} \geq xs(S) = \frac{\sum_{j=1}^k v_{ij}}{\sum_{j=1}^kw_{ij}}$$.
Demy would like to select such k jewels that their specific value is maximal possible. Help her to do so.
## Analysis:
不妨令
$$ \frac{\sum_{j=1}^k v_{ij}}{\sum_{j=1}^kw_{ij}} \geq x
则
k∑j=1vij≥xk∑j=1wij
即
k∑j=1vij−xk∑j=1wij≥0
只需要判断二分的每个k是否满足 ≥ 0即可。
Code
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define N 100001 #define INF 0x3f3f3f3f using namespace std; const double EPS = 0.00001;//精度 int v[N],w[N],ans[N],n,k; struct Node{ int id; double val; bool operator < (const Node& x) const { return val > x.val; } }f[N]; bool C(double x){ for(int i = 0;i < n;++i){ f[i].val = v[i] - w[i]*x; f[i].id = i + 1; } sort(f,f + n); double sum = 0; for(int i = 0;i < k;++i){ sum += f[i].val; ans[i] = f[i].id; } return sum >= 0; } void solve(){ double lb = 0,ub = INF; while(lb + EPS < ub){ double mid = (lb + ub)/2; if(C(mid)) lb = mid; else ub = mid; } for(int i = 0;i < k;++i){ printf("%d ",f[i].id); } } int main(){ scanf("%d%d",&n,&k); for(int i = 0;i < n;++i){ scanf("%d %d",&v[i],&w[i]); } solve(); return 0; }
岂能尽如人意,但求无愧我心
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· .NET 进程 stackoverflow异常后,还可以接收 TCP 连接请求吗?
· 本地部署 DeepSeek:小白也能轻松搞定!
· 基于DeepSeek R1 满血版大模型的个人知识库,回答都源自对你专属文件的深度学习。
· 在缓慢中沉淀,在挑战中重生!2024个人总结!
· 大人,时代变了! 赶快把自有业务的本地AI“模型”训练起来!
· Tinyfox 简易教程-1:Hello World!