训练 投入 欲望。  ---贾森博尔特

第一题:二分枚举答案,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的更多相关文章

  1. hihocoder [Offer收割]编程练习赛4

    描述 最近天气炎热,小Ho天天宅在家里叫外卖.他常吃的一家餐馆一共有N道菜品,价格分别是A1, A2, ... AN元.并且如果消费总计满X元,还能享受优惠.小Ho是一个不薅羊毛不舒服斯基的人,他希望 ...

  2. hihocoder [Offer收割]编程练习赛61

    [Offer收割]编程练习赛61 A:最小排列 给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列. 贪心即可,b是A的子序列,把不在b中的元素, ...

  3. [Offer收割]编程练习赛46

    [Offer收割]编程练习赛46赛后题解 A.AEIOU 分析

  4. 从谷歌面试翻车到offer收割的心路历程

    首先声明,这只是我的播客随感,其中无法避免有一些个人色彩的见解,请不要在意,我尊敬任何的互联网公司,尊敬研究生期间的老师同学,我只希望给在求学路上的CS同学一些启发. 先介绍一下背景,我是ACM铜牌退 ...

  5. ACM学习历程—Hihocoder [Offer收割]编程练习赛1

    比赛链接:http://hihocoder.com/contest/hihointerview3/problem/1 大概有一个月没怎么打算法了.这一场的前一场BC,也打的不是很好.本来Div1的A和 ...

  6. CCCC 以及 hihocoder offer收割赛11 ~~~

    CCCC  真的很蒙  ,没有队服,没有狗牌,服务器崩溃到14:10  才开始比赛...(黑人问号 开始前,发现旁边是西交老大吴航,mad~各种紧张.看着大佬疯狂的敲宏定义就很怕啊.100多行,一行头 ...

  7. [Offer收割]编程练习赛3 - 题目3 : 智力竞赛

    智力竞赛 Problem's Link ---------------------------------------------------------------------------- Mea ...

  8. [Offer收割]编程练习赛5-1 小Ho的防护盾

    #1357 : 小Ho的防护盾 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho的虚拟城市正在遭受小Hi的攻击,小Hi用来攻击小Ho城市的武器是一艘歼星舰,这艘歼星 ...

  9. hiho #1272 买零食 [Offer收割]编程练习赛2

    #1272 : 买零食 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho很喜欢在课间去小卖部买零食.然而不幸的是,这个学期他又有在一教的课,而一教的小卖部姐姐以冷若冰 ...

随机推荐

  1. 嵌入式LinuxC语言程序设计基础教程

    第1章 嵌入式LinxuC语言开发工具 第2章 数据 第3章 数据的输入输出 第4章 运算符和表达式 第5章 程序结构和控制语句 第6章 数组 第7章 指针 第8章 函数 第9章 用户自定义数据类型 ...

  2. 腾讯云,体验域名注册解析与SSL证书

    体验域名注册解析与SSL证书 购买域名 任务时间:30min ~ 60min 在腾讯云上购买域名 首先需要在腾讯云上购买域名, 点击以下链接可以观看购买操作的指引 如何在腾讯云上购买域名 域名解析 域 ...

  3. Java基础学习总结(80)——Java性能优化详解

    让Java应用程序运行是一回事,但让他们跑得快就是另外一回事了.在面对对象的环境中,性能问题就像来势凶猛的野兽.但JVM的复杂性将性能调整的复杂程度增加了一个级别.这里Refcard涵盖了JVM in ...

  4. BNUOJ 19792 Airport Express

    Airport Express Time Limit: 1000ms Memory Limit: 131072KB This problem will be judged on UVA. Origin ...

  5. nyoj 63 小猴子下落

    小猴子下落 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 有一颗二叉树,最大深度为D,且所有叶子的深度都相同.所有结点从左到右从上到下的编号为1,2,3,····· ...

  6. hdu 4670 树的分治-求点对的个数

    /* 树的分治 因为树的点权值可达到10^15,注意手动扩栈,还有int64 题意:给你一棵树,给你一些素数,给你每个点一个权值且每个权值均可由这些素数组成.现在定义任意任意两点的价值为他们路径上的权 ...

  7. [转] python 获取本机ip地址的两种实现方法

    #!/usr/bin/python import socket import fcntl import struct def get_ip_address(ifname): s = socket.so ...

  8. 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 ...

  9. java中普通的顶级类是不能使用static关键字修饰的。只有内部类可以使用static修饰,也可以不使用staitc关键字修饰。

    java中普通的顶级类是不能使用static关键字修饰的.只有内部类可以使用static修饰,也可以不使用staitc关键字修饰. java中的类可以是static吗?答案是可以.在java中我们可以 ...

  10. php7.0升级到php7.1

    $ add-apt-repository ppa:ondrej/php$ apt-get update$ apt-get upgrade php 来源:http://www.wuweixin.com/ ...