Gym 100490A-A - Approximation-数学
来源:互联网 发布:淘宝国际快递转运 编辑:程序博客网 时间:2024/06/16 17:51
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=183934
题意是 给你一段随机的n个 数字ai, 请找出每个数字对应的一个b值 输出一段非递减的b【i】
使得
最小!
首先要知道一个知识,对于一段数,要找到一个最小的s,那么只要让每一个bi=平均数即可 *
其次,题目要求b数组是非递减的。
对于一段a[1]~a[i],设其最优平均数为ave,即b[1]~b[i]=ave;
对于a[i+1]:
如果a[i+1]=ave;那么就让b[a+1]=ave; S不变
如果a[i+1]<ave;由(*)式可知,对a[1]~a[i],使得S最小的是ave,现在如果把a[i+1]纳入其中,必使得平均数不等于ave,那么a[1]~a[i+1]得到的S必将小于原来的最优S,我们记这部分差为S1;又b[i+1]必定为一正数S2,所以纳入a[i+1]后的S3=S+S1+S2>S 本不应该选。 但是如果不选,就是令b[i+1]=b[i+1] ,但是这样会使得B【i+1】<B[1]~B[i] ,与题目的“非递减” 要求冲突,所以此情况下应该把a[i+1]纳入。 并且!,当a[i+1]纳入后,由上面分析可知,当前的ave会变小,因此每次纳入新元素后,得和之前的所有ave比较一次,如果他的前面有比当前ave大的b[i]值,就得把那个点 到当前点 b值替换为 那个点 到当前点的 平均数
如果a[i+1]>ave,由以上分析,令b[i+1]=b[i+1],能得到最小的S,此时 B【i+1】》B[1]~B[i] 不冲突。
其实就是 从一开始贪心,遇到非升序的数就一直纳入并把从开始到当前的位置的B值置为 纳入新数后整段的平均数。
遇到第一个非降序的字符,就以之为新起点计算
PS: 每次纳入新数后,由于ave会减小,所以需要把以前的ave都比较一遍,保证 “非递减”(当然不能for模拟..会超时..具体实现看代码 )
#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <algorithm>#include <iostream>#include <queue>#include <map>#include <set>#include <vector>#define inf 0x7f7f7f7fusing namespace std;const int maxn = 200005; int min(int a,int b){return a<b?a:b;}struct node {int l,r;double ave;};node ans[maxn];int tm[maxn];__int64 sum[maxn]; int main(){ freopen( "approximation.in","r",stdin ); //scanf 从1.txt输入<span style="white-space:pre"></span> freopen( "approximation.out","w",stdout ); //printf输出到1.tx int n,j,i;cin>>n; for (i=1;i<=n;i++){scanf("%d",&tm[i]);sum[i]=sum[i-1]+tm[i];}int posi=0;for (i=1;i<=n;i++){node tmp;tmp.l=tmp.r=i;tmp.ave=tm[i];while(posi!=-1){if (tmp.ave<ans[posi].ave){tmp.l=ans[posi].l;tmp.ave=((double)(sum[i]-sum[tmp.l-1]))/((double)(i-tmp.l+1));posi--;}elsebreak; } ans[++posi]=tmp;} for (i=1;i<=posi;i++){for (j=ans[i].l;j<=ans[i].r;j++){printf("%.9lf ",ans[i].ave);}}printf("\n");return 0;}
- Gym 100490A-A - Approximation-数学
- URAL 1828. Approximation by a Progression 数学
- Gym - 101102A A. Coins 背包问题、数学
- GYM 100030 A. Innovative Experiment(组合数学)
- URAL - 1828 Approximation by a Progression(最小二乘法)
- Gym 100015A
- codeforces gym 100645A
- CodeForces Gym 100803A
- Gym 100543A Parades
- Gym 100962A ABBA
- codeforces Gym 101102A
- Codeforces Gym 100372A
- 【Codeforces Gym 100187A】
- Gym 101147.A
- Gym 100273A Ants
- Codeforces Gym 100889 A. A Beautiful Array
- CodeForces Gym 100989A LCS (A)
- Codeforces Gym 101158 A. Rearranging a Sequence
- Mysql Linux数据目录变更迁移
- BZOJ 3550 [ONTAK2010]Vacation 线性规划
- 九度oj 1119
- c++学习笔记(三)多态性
- unity3D中脚本生命周期
- Gym 100490A-A - Approximation-数学
- linux命令
- day7: 类的扩展 NSDate NSDateFormatter Category Extension延展 Protocol协议 delegate代理
- android Listview,gridview局部刷新,部分刷新
- bzoj-3118 Orz the MST
- 文章标题
- ListView在不刷新整个界面下,单独更新item
- POJ 1007 DNA Sorting 水
- 如何使用iOS 8的虚化效果