HDOJ 4923 Room and Moor
2017-07-20 16:52 tlnshuju 阅读(152) 评论(0) 编辑 收藏 举报
用一个栈维护b的值,每次把一个数放到栈顶。
看栈首的值是不是大于这个数,假设大于的话将栈顶2个元素合并。b的值就是这两个栈顶元素的平均值。
。。
Room and Moor
Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 943 Accepted Submission(s): 291
Problem Description
PM Room defines a sequence A = {A1, A2,..., AN}, each of which is either 0 or 1. In order to beat him, programmer Moor has to construct another sequence B = {B1, B2,... , BN} of the same length,
which satisfies that:
![](http://acm.hdu.edu.cn/data/images/C507-1003-1.jpg)
![](http://acm.hdu.edu.cn/data/images/C507-1003-1.jpg)
Input
The input consists of multiple test cases. The number of test cases T(T<=100) occurs in the first line of input.
For each test case:
The first line contains a single integer N (1<=N<=100000), which denotes the length of A and B.
The second line consists of N integers, where the ith denotes Ai.
For each test case:
The first line contains a single integer N (1<=N<=100000), which denotes the length of A and B.
The second line consists of N integers, where the ith denotes Ai.
Output
Output the minimal f (A, B) when B is optimal and round it to 6 decimals.
Sample Input
4 9 1 1 1 1 1 0 0 1 1 9 1 1 0 0 1 1 1 1 1 4 0 0 1 1 4 0 1 1 1
Sample Output
1.428571 1.000000 0.000000 0.000000
Author
BUPT
Source
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <stack> #include <cmath> using namespace std; const double eps=1e-8; double a[110000],b[110000]; typedef pair<double,double> pDD; int n; stack<pDD> STACK; int main() { int T_T; scanf("%d",&T_T); while(T_T--) { scanf("%d",&n); while(STACK.size()) STACK.pop(); for(int i=0;i<n;i++) { scanf("%lf",a+i); pDD A=pDD(a[i],1); while(STACK.size()&&A.first+eps<STACK.top().first) { pDD B=STACK.top(); STACK.pop(); double Sec=A.second+B.second; double Fst=(A.first*A.second+B.first*B.second)/Sec; A.first=Fst; A.second=Sec; } STACK.push(A); } int now=n-1; while(STACK.size()) { pDD u=STACK.top(); STACK.pop(); int sz=u.second; for(int i=now,j=0;i>=0&&j<sz;i--,j++) { b[now--]=u.first; } } double ans=0; for(int i=0;i<n;i++) { ans+=(a[i]-b[i])*(a[i]-b[i]); } printf("%.6lf\n",ans); } return 0; }