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

第一题:二分枚举答案,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能够达到的最高的强力值。

只要你的结果与正确答案之间的相对或绝对误差不超过千分之一,都被视为正确的输出。

样例输入

  1. 5 2
  2. 1 1
  3. 3 2

样例输出

  1. 2.88

解体思路:

1.一开始yy的各种结论,发现不准。最后,为了搞定小数据集,暴力将n分解成k份,然后求解。这样可以过掉30%的小数据。

  1. //
  2. // main.cpp
  3. // ProjectC
  4. //
  5. // Created by LiJinxu on 16/8/13.
  6. // Copyright © 2016年 LiJinxu-NEU. All rights reserved.
  7. //
  8.  
  9. #include <iostream>
  10. #include <cstdio>
  11. #include <string>
  12. #include <algorithm>
  13. #include <queue>
  14. #include <stack>
  15. #include <math.h>
  16. #include <vector>
  17.  
  18. using namespace std;
  19.  
  20. const int INF = 0x3f3f3f3f;
  21. const int Maxn = ;
  22. int n, k;
  23. double a[Maxn], b[Maxn];
  24. vector<pair<double, double>>rec;
  25.  
  26. bool cmp(pair<double, double> &p1, pair<double, double> &p2){
  27. if(p1.first == p2.first){
  28. return p1.second < p2.second;
  29. }
  30. return p1.first < p2.first;
  31. }
  32.  
  33. void divideN2Kparts(int pos, int left, int *path, vector<vector<int>>&rec)
  34. {
  35. if(left == && pos == k){
  36. vector<int>tmp;
  37. for(int i = ; i < k; i ++)
  38. tmp.push_back(path[i]);
  39. rec.push_back(tmp);
  40. return ;
  41.  
  42. }else if(left && pos >= k){
  43. return ;
  44. }
  45. for(int i = n; i >= ; i --){
  46. if(left < i) continue;
  47. left -= i;
  48. path[pos] = i;
  49. pos ++;
  50. divideN2Kparts(pos, left, path, rec);
  51. pos --;
  52. path[pos] = ;
  53. left += i;
  54. }
  55. }
  56.  
  57. void smallSolution()
  58. {
  59. vector<vector<int>>rec;
  60. int path[Maxn];
  61. for(int i = ;i < k; i ++)
  62. path[i] = ;
  63. divideN2Kparts(, n, path, rec);
  64. double fAns = ;
  65. for(int i = ; i < rec.size(); i ++){
  66. double ans = ;
  67. for (int j = ; j < rec[i].size(); j++) {
  68. ans *= pow(a[j] + (double) rec[i][j], (1.0/b[j]));
  69. }
  70. if(fAns < ans)
  71. fAns = ans;
  72. }
  73. printf("%.2lf\n",fAns);
  74.  
  75. }
  76. int main() {
  77. cin>>n>>k;
  78. for(int i = ; i < k; i ++){
  79. scanf("%lf", &a[i]);
  80. }for(int i = ; i < k; i ++)
  81. scanf("%lf", &b[i]);
  82. smallSolution();
  83. return ;
  84. }

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]很小,用优先队列维护开销不大。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <string>
  4. #include <algorithm>
  5. #include <math.h>
  6. #include <queue>
  7. #include <vector>
  8. #include <map>
  9. #define INF 0x3f3f3f3f
  10.  
  11. using namespace std;
  12.  
  13. const int Maxn = ;
  14. int n, k;
  15. double a[Maxn];
  16. struct node{
  17. double x, y;
  18. int id;
  19. bool operator <(const node &p)const{
  20. return 1.0 / y * (log(x + ) - log(x)) < 1.0 / p.y * (log(p.x + ) - log(p.x));
  21. }
  22. }rec[Maxn];
  23.  
  24. priority_queue<node>p_que;
  25.  
  26. int main()
  27. {
  28. cin>>n>>k;
  29. for(int i = ; i < k; i ++){
  30. scanf("%lf", &a[i]);
  31. rec[i].x = a[i];
  32. rec[i].id = i;
  33. }
  34. for(int i = ; i < k; i ++)
  35. scanf("%lf", &rec[i].y);
  36. for(int i = ; i < k; i ++)
  37. p_que.push(rec[i]);
  38. for(int i = ; i < n; i ++){
  39. node p = p_que.top();
  40. p_que.pop();
  41. p.x ++;
  42. a[p.id] ++;
  43. p_que.push(p);
  44. }
  45. double ans = 1.0;
  46. for(int i = ; i < k; i ++){
  47. ans *= pow(a[i], 1.0/rec[i].y);
  48. }
  49. printf("%lf\n",ans);
  50. //system("pause");
  51. return ;
  52. }

  最后,关于优先队列的运算符重载,只能重载<。其他运算符会出错。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. BZOJ 1468 Tree 【模板】树上点分治

    #include<cstdio> #include<algorithm> #define N 50010 #define M 500010 #define rg registe ...

  2. [K/3Cloud] KSQL日期常量用法注意

    KSQL中用日期常量必须用{ts'" + dateTime.ToString("yyyy-M-d HH:mm:ss") + "'} 正确写法: INSERT I ...

  3. Linux下汇编语言学习笔记75 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  4. Bellman_ford 算法 Currency Exchange POJ1860

    Bellman_ford算法用于寻找正环或者负环! 算法导论: 24.1 The Bellman-Ford algorithm The Bellman-Ford algorithm solves th ...

  5. Redis: Useful commands

    SELECT X - Select database (the X must be int) CONFIG GET databases - Get databases number INFO keys ...

  6. C#中方法的详解

    访问修饰符 修饰符 返回值类型 方法名(参数列表){ 语句块;} 访问修饰符:所有类成员访问修饰符都可以使用,如果省略访问修饰符,默认是private. 修饰符:在定义方法时修饰符包括virtual( ...

  7. [JavaEE] Implement a REST Endpoint

    1. Create a rest folder with JAXRSConfiguration.java: package com.pluralsight.bookstore.rest; import ...

  8. 关于NSString,NSMutableString,NSArray,NSMutableArray,NSDictionary,NSMutableDictionary

    NSString,NSMutableString,NSArray,NSMutableArray,NSDictionary,NSMutableDictionary 在 OC 中我们天天都要用,而我们要怎 ...

  9. NYOJ 330 一个简单的数学题【数学题】

    /* 题目大意:求解1/n; 解题思路:写一个输出小数的算法 关键点:怎样处理小数点循环输出 解题人:lingnichong 解题时间:2014-10-18 09:04:22 解题体会:输出小数的算法 ...

  10. 破解IntelliJ IDEA 2017

    一.下载地址 http://www.jetbrains.com/idea/ 二.下载破解jar包 http://idea.lanyus.com/ 2.1 将下载好的jar包放在IDEA的bin文件下 ...