[hdu7033]Typing Contest
为了避免浮点运算,不妨将$f_{i}$乘上$C=10^{2}$,问题即求$\max_{S\subseteq [1,n]}\frac{\sum_{i\in S}(C^{2}-(\sum_{j\in S}f_{j}-f_{i})f_{i})s_{i}}{C^{2}}$
记$F=\sum_{i\in S}f_{i}$,考虑枚举$F$,并以$f_{i}$为质量、$(C^{2}-(F-f_{i})f_{i})s_{i}$为价值,问题即是要求质量和恰为$F$的最大价值和,可以通过01背包解决
考虑此时的复杂度,$F$的范围为$Cn$,复杂度即$o(C^{2}n^{3})$,无法通过
事实上,最优解满足$F\le C\sqrt{n}$,证明如下:
注意到随着$F$的增大价值降低,因此不妨将"质量和恰为$F$"改为不超过$F$
如果某人价值为负,那么不选一定更优,因此即$\forall i\in S,(C^{2}-(F-f_{i})f_{i})s_{i}\ge 0$
去掉$s_{i}$再将其对所有$i$求和,整理后即$F^{2}-|S|C^{2}\le \sum_{i\in S}f_{i}^{2}$
去掉$s_{i}$并乘上$f_{i}$,再将其对所有$i$求和,整理后即$\sum_{i\in S}f_{i}^{2}\le \frac{\sum_{i\in S}f_{i}^{3}
}{F}+|S|C^{2}$
将两式联立,即$F^{2}-|S|C^{2}\le \frac{\sum_{i\in S}f_{i}^{3}
}{F}+|S|C^{2}$
显然$|S|\le n$且$\frac{\sum_{i\in S}f_{i}^{3}}{F}\le F^{2}$,由此放缩即$F^{2}\le nC^{2}$,也即$F\le C\sqrt{n}$
由此,复杂度降为$o(C^{2}n^{2})$,可以通过

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 105
4 #define C 100
5 #define ll long long
6 int t,n,m,a[N];
7 ll ans,s[N],f[N*C];
8 double p;
9 int main(){
10 scanf("%d",&t);
11 while (t--){
12 scanf("%d",&n);
13 m=ans=0;
14 for(int i=1;i<=n;i++){
15 scanf("%lld%lf",&s[i],&p);
16 a[i]=floor(p*C+0.5);
17 m+=a[i];
18 }
19 m=C*((int)sqrt(n)+1);
20 for(int F=0;F<=m;F++){
21 for(int i=0;i<=F;i++)f[i]=0;
22 for(int i=1;i<=n;i++){
23 ll S=(C*C-(F-a[i])*a[i])*s[i];
24 for(int j=F;j>=a[i];j--)f[j]=max(f[j],f[j-a[i]]+S);
25 }
26 ans=max(ans,f[F]);
27 }
28 printf("%lld.",ans/(C*C));
29 ans%=C*C;
30 if (ans<1000)printf("0");
31 if (ans<100)printf("0");
32 if (ans<10)printf("0");
33 printf("%lld00000\n",ans);
34 }
35 return 0;
36 }
[hdu7033]Typing Contest的更多相关文章
- Python标准库--typing
作者:zhbzz2007 出处:http://www.cnblogs.com/zhbzz2007 欢迎转载,也请保留这段声明.谢谢! 1 模块简介 Python 3.5 增加了一个有意思的库--typ ...
- 最牛的打字效果JS插件 typing.js
最新在做公司的一个项目,需要实现一个敲打代码的动画效果,粗意味比较简单,果断自己直接开写,写着写着发现是一个坑.需要支持语法高亮,并不能直接简单的用setTimeout来动态附件innerHTML.苦 ...
- Monkey Patch/Monkey Testing/Duck Typing/Duck Test
Monkey Patch Monkey Testing Duck Typing Duck Test
- Programming Contest Problem Types
Programming Contest Problem Types Hal Burch conducted an analysis over spring break of 1999 and ...
- hdu 4946 2014 Multi-University Training Contest 8
Area of Mushroom Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 2016 Multi-University Training Contest 2 D. Differencia
Differencia Time Limit: 10000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- 2016 Multi-University Training Contest 1 G. Rigid Frameworks
Rigid Frameworks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- hdu-5988 Coding Contest(费用流)
题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
- ZOJ 3703 Happy Programming Contest
偏方记录背包里的物品.....每个背包的价值+0.01 Happy Programming Contest Time Limit: 2 Seconds Memory Limit: 65536 ...
随机推荐
- electron-builder进行DEBUG输出的正确方式
前言 使用Electron进行打包通常会用到electron-builder或者electron-packager两种工具.在使用electron-builder的时候,由于对机制的不熟悉,我们在打包 ...
- SpringBoot下使用AspectJ(CTW)下不能注入SpringIOC容器中的Bean
SpringBoot下使用AspectJ(CTW)下不能注入SpringIOC容器中的Bean 在SpringBoot中开发AspectJ时,使用CTW的方式来织入代码,由于采用这种形式,切面Bean ...
- java课堂测试3第一部分(未完善)
package test3;import java.util.*; public class Grade2 { static String[][] mis=new String[500][4]; // ...
- python 类中的公有属性 私有属性 实例属性
class parent(): i=1 __j=2 class child(parent): m=3 __n=4 def __init__(self,age,name): self.age=age s ...
- 【c++ Prime 学习笔记】第15章 面向对象程序设计
15.1 OOP:概述 面向对象程序设计(object-oriented programming)的核心思想是:数据抽象.继承.动态绑定 使用数据抽象,可将类的接口与实现分离 使用继承,可定义相似的类 ...
- Java:NIO 学习笔记-1
Java:NIO 学习笔记-1 说明:本笔记是根据bilibili上 尚硅谷 的课程 NIO视频 而做的笔记 主要内容 Java NIO 简介 Java NIO 与 IO 的主要区别 缓冲区(Buff ...
- MySQL:提高笔记-1
MySQL:提高笔记-1 学完基础的语法后,进一步对 MySQL 进行学习 说明:这是根据 bilibili 上 黑马程序员 的课程 mysql入门到精通 后做的笔记 1. 索引 1.1 索引概述 M ...
- [对对子队]Scrum Meeting 博客汇总
对对子队 博客目录 一.Scrum Meeting 1. Alpha Scrum Meeting 1(会议记录4.10) Scrum Meeting 2(会议记录4.11) Scrum Meeting ...
- [对对子队]会议记录5.16(Scrum Meeting3)
今天已完成的工作 何瑞 工作内容:搭建关卡5.6,优化之前的成本系统 相关issue:搭建关卡4.5.6 相关签入:feat: 第五第六关搭建完成 吴昭邦 工作内容:搭建关卡5.6 ...
- 并发编程从零开始(十一)-Atomic类
并发编程从零开始(十一)-Atomic类 7 Atomic类 7.1 AtomicInteger和AtomicLong 如下面代码所示,对于一个整数的加减操作,要保证线程安全,需要加锁,也就是加syn ...