Solution

分数规划经典题. 话说我怎么老是忘记分数规划怎么做呀...

所以这里就大概写一下分数规划咯:

分数规划解决的是这样一类问题: 有\(a_1, a_2 ... a_n\)和\(b_1, b_2 ... b_n\)这样一些值(其中\(b\)严格大于零), 其中\(a\)和\(b\)之间存在某种联系; 要你决策出每个\(a_k\), 使得

\[ans = \frac{\sum_{x = 1}^n a_x}{\sum_{x = 1}^n b_x}
\]

取得最大值或最小值.

考虑怎样解决: 考虑二分\(ans\), 找到一个最大的\(ans\)使得

\[\frac{\sum_{x = 1}^n a_x}{\sum_{x = 1}^n b_x} \ge ans
\]

稍作变换, 得到

\[\sum_{x = 1}^n a_x \ge ans \sum_{x = 1}^n b_x \\
\sum_{x = 1}^n a_x - b_x \times ans \ge 0
\]

在每个位置\(i\)上决策\(a\)和\(b\)即可.

换到这一题, 直接照搬上述思路即可, 不再赘述了.

#include <cstdio>
#include <cctype>
#include <algorithm>
#include <cstring>
#include <cmath> using namespace std;
namespace Zeonfai
{
inline int getInt()
{
int a = 0, sgn = 1; char c;
while(! isdigit(c = getchar())) if(c == '-') sgn *= -1;
while(isdigit(c)) a = a * 10 + c - '0', c = getchar();
return a * sgn;
}
}
const int N = 500;
int suc[N + 1][2], a[N + 1], b[N + 1], sz[N + 1];
double f[N << 2][N + 2];
int main()
{ #ifndef ONLINE_JUDGE freopen("zs.in", "r", stdin);
freopen("zs.out", "w", stdout); #endif using namespace Zeonfai;
int n = getInt(), cnt = n;
for(int i = 1; i <= n; ++ i)
{
for(int j = 0; j < 2; ++ j)
{
_suc[i][j] = getInt();
if(! _suc[i][j]) suc[i][j] = ++ cnt;
}
a[i] = getInt(); b[i] = getInt();
}
for(int i = cnt; i > n; -- i) sz[i] = 1;
for(int i = n; i; -- i) sz[i] = sz[suc[i][0]] + sz[suc[i][1]];
double L = 0, R = 10, ans;
while(R - L > 1e-5)
{
double mid = (R + L) / 2;
for(int i = 1; i <= n; ++ i) for(int j = 0; j <= n + 1; ++ j) f[i][j] = - 1e9;
for(int i = cnt; i > n; -- i) for(int j = 0; j < 2; ++ j) f[i][j] = 0;
for(int i = n; i; -- i) for(int j = 0; j <= sz[suc[i][0]]; ++ j) for(int k = 0; k <= sz[suc[i][1]]; ++ k)
f[i][j + k] = max(f[i][j + k], f[suc[i][0]][j] + f[suc[i][1]][k] + abs(j - k) * a[i] - mid * (j ^ k ^ b[i]));
int flg = 0;
for(int i = 0; i <= sz[1]; ++ i) if(f[1][i] >= mid) flg = 1;
if(flg) ans = mid, L = mid; else R = mid;
}
printf("%.2lf\n", ans);
}

2016集训测试赛(十八)Problem C: 集串雷 既分数规划学习笔记的更多相关文章

  1. 2016集训测试赛(二十六)Problem A: bar

    Solution 首先审清题意, 这里要求的是子串而不是子序列... 我们考虑用1表示p, -1表示j. 用sum[i]表示字符串前\(i\)的前缀和. 则我们考虑一个字符串\([L, R]\)有什么 ...

  2. 2016集训测试赛(二十四)Problem B: Prz

    Solution 这道题有两个关键点: 如何找到以原串某一个位置为结尾的某个子序列的最晚出现位置 如何找到原串中某个位置之前的所有数字的最晚出现位置中的最大值 第一个关键点: 我们注意到每个数字在\( ...

  3. 2016集训测试赛(二十四)Problem C: 棋盘控制

    Solution 场上的想法(显然是错的)是这样的: 我们假设棋子是一个一个地放置的, 考虑在放置棋子的过程中可能出现哪些状态. 我们令有序整数对\((i, j)\)表示总共控制了\(i\)行\(j\ ...

  4. 2016集训测试赛(十九)Problem C: 无聊的字符串

    Solution 傻X题 我的方法是建立后缀后缀树, 然后在DFS序列上直接二分即可. 关键在于如何得到后缀树上每个字符对应的字节点: 我们要在后缀自动机上记录每个点在后缀树上对应的字母. 考虑如何实 ...

  5. 2016集训测试赛(十九)Problem A: 24点大师

    Solution 这到题目有意思. 首先题目描述给我们提供了一种非常管用的模型. 按照题目的方法, 我们可以轻松用暴力解决20+的问题; 关键在于如何构造更大的情况: 我们发现 \[ [(n + n) ...

  6. 2016集训测试赛(二十)Problem B: 字典树

    题目大意 你们自己感受一下原题的画风... 我怀疑出题人当年就是语文爆零的 下面复述一下出题人的意思: 操作1: 给你一个点集, 要你在trie上找到所有这样的点, 满足点集中存在某个点所表示的字符串 ...

  7. 2016集训测试赛(二十)Problem A: Y队列

    Solution 考虑给定一个\(n\), 如何求\(1\)到\(n\)的正整数中有多少在队列中. 不难注意到我们只需要处理质数次方的情况即可, 因为合数次方会被其因数处理到. 同时我们考虑到可能存在 ...

  8. 2016北京集训测试赛(八)Problem C: 直径

    Solution 一个定理: 把两棵树用一条边练成一棵树后, 树的直径在原来两棵树的四个直径端点中产生. 放到这一题, 我们通过DP先求出大树中以每个点为根的子树中的直径, 再取每棵小树中与其他树有连 ...

  9. 【2016北京集训测试赛(八)】 crash的数列 (思考题)

    Description 题解 题目说这是一个具有神奇特性的数列!这句话是非常有用的因为我们发现,如果套着这个数列的定义再从原数列引出一个新数列,它居然还是一样的...... 于是我们就想到了能不能用多 ...

随机推荐

  1. Redis实现之数据库(一)

    服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构体的db数组中,db数组的每个项都是一个redis.h/redisDb结构体,每个redisD ...

  2. Logistic回归python实现小样例

    假设现在有一些点,我们用一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称作回归.利用Logistic回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,依次进行分类.Lo ...

  3. mysql基础查询

    #进阶1:基础查询/*语法:select:查询列表 from 表名; 类似于:System.out.println(打印的东西); 特点:1.查询列表可以是:表中的字段.常量值.表达式.函数2.查询的 ...

  4. Migrate a Domain-based Namespace to Windows Server 2008 Mode

    TechNet Library Scripting with Windows PowerShell Windows and Windows Server Automation with Windows ...

  5. 我给女朋友讲编程CSS系列(2)- CSS语法、3大选择器、选择器优先级

    首先看一下使用Css设置h1标签字体颜色和大小的例子,效果图如下: 新建一个网页test.html,然后复制粘贴下面的内容: <html> <head> <style t ...

  6. k8s与CICD--借助scp插件实现非容器项目的部署

    一直没有时间完成drone系列文章.drone-wechat插件实现了一半,由于企业微信token申请比较麻烦,所以也没有进展.今天抽出时间,研究了一下scp插件,主要目的是实现非容器项目的部署.其实 ...

  7. mysql中游标的使用案例详解(学习笔记)(转)

    1.游标是啥玩意?简单的说:游标(cursor)就是游动的标识,啥意思呢,通俗的这么说,一条sql取出对应n条结果资源的接口/句柄,就是游标,沿着游标可以一次取出一行.我给大家准备一张图: 2.怎么使 ...

  8. 事务ACID特性,其中I代表隔离性(Isolation)。

    事务ACID特性,其中I代表隔离性(Isolation). 什么是事务的隔离性? 隔离性是指,多个用户的并发事务访问同一个数据库时,一个用户的事务不应该被其他用户的事务干扰,多个并发事务之间要相互隔离 ...

  9. 本文将介绍“数据计算”环节中常用的三种分布式计算组件——Hadoop、Storm以及Spark。

    本文将介绍“数据计算”环节中常用的三种分布式计算组件——Hadoop.Storm以及Spark. 当前的高性能PC机.中型机等机器在处理海量数据时,其计算能力.内存容量等指标都远远无法达到要求.在大数 ...

  10. bzoj3105【CQOI2013】新nim游戏

    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=3105 sol  :要想必胜则拿完后异或空间不能包含0,即给对手留下一组线性基 为保证拿走的最小 ...