Offer收割_5
训练 投入 欲望。 ---贾森博尔特
第一题:二分枚举答案,check时候模拟一下即可。
时间复杂度: O(n*logn)。
第二题:
描述
小Hi在虚拟世界中有一只小宠物小P。小P有K种属性,每种属性的初始值为Ai。小Ho送给了小Hi若干颗药丸,每颗药丸可以提高小P指定属性1点。通过属性值,我们可以计算小P的强力值=(C1(1/B1))*(C2(1/B2))*...*(CK(1/BK)),其中Ci为小P第i项属性的最终值(Ai+药丸增加的属性)。 已知小Ho送给小Hi的药丸一共有N颗,问小P的强力值最高能够达到多少?
输入
第一行包含两个整数N,K,分别表示药丸数和属性种数。
第二行为K个整数A1 - AK,意义如前文所述。
第三行为K个整数B1 - BK,意义如前文所述。
对于30%的数据,满足1<=N<=10, 1<=K<=3
对于100%的数据,满足1<=N<=100000, 1<=K<=10
对于100%的数据,满足1<=Ai<=100, 1<=Bi<=10
输出
输出小P能够达到的最高的强力值。
只要你的结果与正确答案之间的相对或绝对误差不超过千分之一,都被视为正确的输出。
样例输入
5 2
1 1
3 2
样例输出
2.88
解体思路:
1.一开始yy的各种结论,发现不准。最后,为了搞定小数据集,暴力将n分解成k份,然后求解。这样可以过掉30%的小数据。
//
// main.cpp
// ProjectC
//
// Created by LiJinxu on 16/8/13.
// Copyright © 2016年 LiJinxu-NEU. All rights reserved.
// #include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
#include <math.h>
#include <vector> using namespace std; const int INF = 0x3f3f3f3f;
const int Maxn = ;
int n, k;
double a[Maxn], b[Maxn];
vector<pair<double, double>>rec; bool cmp(pair<double, double> &p1, pair<double, double> &p2){
if(p1.first == p2.first){
return p1.second < p2.second;
}
return p1.first < p2.first;
} void divideN2Kparts(int pos, int left, int *path, vector<vector<int>>&rec)
{
if(left == && pos == k){
vector<int>tmp;
for(int i = ; i < k; i ++)
tmp.push_back(path[i]);
rec.push_back(tmp);
return ; }else if(left && pos >= k){
return ;
}
for(int i = n; i >= ; i --){
if(left < i) continue;
left -= i;
path[pos] = i;
pos ++;
divideN2Kparts(pos, left, path, rec);
pos --;
path[pos] = ;
left += i;
}
} void smallSolution()
{
vector<vector<int>>rec;
int path[Maxn];
for(int i = ;i < k; i ++)
path[i] = ;
divideN2Kparts(, n, path, rec);
double fAns = ;
for(int i = ; i < rec.size(); i ++){
double ans = ;
for (int j = ; j < rec[i].size(); j++) {
ans *= pow(a[j] + (double) rec[i][j], (1.0/b[j]));
}
if(fAns < ans)
fAns = ans;
}
printf("%.2lf\n",fAns); }
int main() {
cin>>n>>k;
for(int i = ; i < k; i ++){
scanf("%lf", &a[i]);
}for(int i = ; i < k; i ++)
scanf("%lf", &b[i]);
smallSolution();
return ;
}
2.全解方案:
根据题意强力值P=(C1(1/B1))*(C2(1/B2))*...*(CK(1/BK)), Ci = (Ai + Xi), N = X0 + .. + Xk; 目标是:让P最大。因为是乘法求最大值问题,我们通过两边去对数log得到:
logP = (1/B1)logC1 + (1/Bi)logCi + (1/Bk)logCk 。 Ci = Ai + Xi。 这样,为了使P最大,我们只需要每次增量(△x = 1)使得整体增量最大即可:max(1/Bi * log(Ai + 1) - 1/Bi * log(Ai))。因为每次增加1,也就是增加到C1 - Ck中的某一项,使得增益最大即可。这里就能够体现出加法的好处,易于衡量结果。
最后,只需要使用一个数据结构(priority_queue)来动态维护每次给对应项增加1(满足收益最大)的过程就好了。 时间复杂度:O(n*logn);
这道题的关键是:增量为1,1个1个的考虑,而不是像我开始解决小规模数据集的思路,上来直接把n分成k份这样整体考虑。k在[1,10]很小,用优先队列维护开销不大。
#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
#include <math.h>
#include <queue>
#include <vector>
#include <map>
#define INF 0x3f3f3f3f using namespace std; const int Maxn = ;
int n, k;
double a[Maxn];
struct node{
double x, y;
int id;
bool operator <(const node &p)const{
return 1.0 / y * (log(x + ) - log(x)) < 1.0 / p.y * (log(p.x + ) - log(p.x));
}
}rec[Maxn]; priority_queue<node>p_que; int main()
{
cin>>n>>k;
for(int i = ; i < k; i ++){
scanf("%lf", &a[i]);
rec[i].x = a[i];
rec[i].id = i;
}
for(int i = ; i < k; i ++)
scanf("%lf", &rec[i].y);
for(int i = ; i < k; i ++)
p_que.push(rec[i]);
for(int i = ; i < n; i ++){
node p = p_que.top();
p_que.pop();
p.x ++;
a[p.id] ++;
p_que.push(p);
}
double ans = 1.0;
for(int i = ; i < k; i ++){
ans *= pow(a[i], 1.0/rec[i].y);
}
printf("%lf\n",ans);
//system("pause");
return ;
}
最后,关于优先队列的运算符重载,只能重载<。其他运算符会出错。return x > a.x //x小的在前。return x < a.x //x大的在前。
Offer收割_5的更多相关文章
- hihocoder [Offer收割]编程练习赛4
描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...
- hihocoder [Offer收割]编程练习赛61
[Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...
- [Offer收割]编程练习赛46
[Offer收割]编程练习赛46赛后题解 A.AEIOU 分析
- 从谷歌面试翻车到offer收割的心路历程
首先声明,这只是我的播客随感,其中无法避免有一些个人色彩的见解,请不要在意,我尊敬任何的互联网公司,尊敬研究生期间的老师同学,我只希望给在求学路上的CS同学一些启发. 先介绍一下背景,我是ACM铜牌退 ...
- ACM学习历程—Hihocoder [Offer收割]编程练习赛1
比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...
- CCCC 以及 hihocoder offer收割赛11 ~~~
CCCC 真的很蒙 ,没有队服,没有狗牌,服务器崩溃到14:10 才开始比赛...(黑人问号 开始前,发现旁边是西交老大吴航,mad~各种紧张.看着大佬疯狂的敲宏定义就很怕啊.100多行,一行头 ...
- [Offer收割]编程练习赛3 - 题目3 : 智力竞赛
智力竞赛 Problem's Link ---------------------------------------------------------------------------- Mea ...
- [Offer收割]编程练习赛5-1 小Ho的防护盾
#1357 : 小Ho的防护盾 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho的虚拟城市正在遭受小Hi的攻击,小Hi用来攻击小Ho城市的武器是一艘歼星舰,这艘歼星 ...
- hiho #1272 买零食 [Offer收割]编程练习赛2
#1272 : 买零食 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho很喜欢在课间去小卖部买零食.然而不幸的是,这个学期他又有在一教的课,而一教的小卖部姐姐以冷若冰 ...
随机推荐
- 嵌入式LinuxC语言程序设计基础教程
第1章 嵌入式LinxuC语言开发工具 第2章 数据 第3章 数据的输入输出 第4章 运算符和表达式 第5章 程序结构和控制语句 第6章 数组 第7章 指针 第8章 函数 第9章 用户自定义数据类型 ...
- 腾讯云,体验域名注册解析与SSL证书
体验域名注册解析与SSL证书 购买域名 任务时间:30min ~ 60min 在腾讯云上购买域名 首先需要在腾讯云上购买域名, 点击以下链接可以观看购买操作的指引 如何在腾讯云上购买域名 域名解析 域 ...
- Java基础学习总结(80)——Java性能优化详解
让Java应用程序运行是一回事,但让他们跑得快就是另外一回事了.在面对对象的环境中,性能问题就像来势凶猛的野兽.但JVM的复杂性将性能调整的复杂程度增加了一个级别.这里Refcard涵盖了JVM in ...
- BNUOJ 19792 Airport Express
Airport Express Time Limit: 1000ms Memory Limit: 131072KB This problem will be judged on UVA. Origin ...
- nyoj 63 小猴子下落
小猴子下落 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 有一颗二叉树,最大深度为D,且所有叶子的深度都相同.所有结点从左到右从上到下的编号为1,2,3,····· ...
- hdu 4670 树的分治-求点对的个数
/* 树的分治 因为树的点权值可达到10^15,注意手动扩栈,还有int64 题意:给你一棵树,给你一些素数,给你每个点一个权值且每个权值均可由这些素数组成.现在定义任意任意两点的价值为他们路径上的权 ...
- [转] python 获取本机ip地址的两种实现方法
#!/usr/bin/python import socket import fcntl import struct def get_ip_address(ifname): s = socket.so ...
- Spring Cloud ZooKeeper集成Feign的坑1,错误:Consider defining a bean of type 'org.springframework.web.client.RestTemplate' in your configuration.
错误如下: ERROR 31473 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** A ...
- java中普通的顶级类是不能使用static关键字修饰的。只有内部类可以使用static修饰,也可以不使用staitc关键字修饰。
java中普通的顶级类是不能使用static关键字修饰的.只有内部类可以使用static修饰,也可以不使用staitc关键字修饰. java中的类可以是static吗?答案是可以.在java中我们可以 ...
- php7.0升级到php7.1
$ add-apt-repository ppa:ondrej/php$ apt-get update$ apt-get upgrade php 来源:http://www.wuweixin.com/ ...