hdu 4923 Room ans Moor

来源:互联网 发布:路由器mac地址过滤功能 编辑:程序博客网 时间:2024/06/07 18:03

Room and Moor

Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 602    Accepted Submission(s): 173


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:

 

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.
 

Output
Output the minimal f (A, B) when B is optimal and round it to 6 decimals.
 

Sample Input
491 1 1 1 1 0 0 1 191 1 0 0 1 1 1 1 140 0 1 140 1 1 1
 

Sample Output
1.4285711.0000000.0000000.000000
 

Author
BUPT
 

Source
2014 Multi-University Training Contest 6
 
比赛的时候没想出来,想复杂了。。

因为A最大为1,所以A^2求和和A是相等的,所以不用记录左右区间。
/***********************************************\ |Author: Messyidea |Created Time: 2014-8-8 10:35:39 |File Name: 03.cpp |Description: \***********************************************/#include <iostream>#include <cstdio>#include <cmath>#include <cstdlib>#include <string>#include <cstring>#include <algorithm>#include <vector>#include <list>#include <map>#include <set>#include <deque>#include <queue>#include <stack>#define L(rt) (rt<<1)#define R(rt) (rt<<1|1)#define mset(l,n) memset(l,n,sizeof(l))#define rep(i,n) for(int i=0;i<n;++i)#define maxx(a) memset(a, 0x3f, sizeof(a))#define zero(a) memset(a, 0, sizeof(a))#define srep(i,n) for(int i = 1;i <= n;i ++)#define MP make_pairconst int inf=0x3f3f3f3f ;const double eps=1e-8 ;const double pi=acos (-1.0);typedef long long ll;using namespace std;#define maxn 100005double len[maxn];double num[maxn];int a,n;int cnt;int main() {//freopen("input.txt","r",stdin);     int cas = 0;    scanf("%d",&cas);    while(cas --){        cnt = 0;        scanf("%d",&n);        rep(i,n) {            scanf("%d",&a);            num[cnt] = a;            len[cnt ++] = 1;            while(cnt >= 2){                if(num[cnt-1]/len[cnt-1] >= num[cnt-2]/len[cnt-2]) break;                num[cnt-2] += num[cnt-1];                len[cnt-2] += len[cnt-1];                cnt--;            }        }        double ans = 0;        for(int i = 0;i<cnt;++i){            double t = num[i]/len[i];            ans += num[i] - 2*t*num[i] + t*t*len[i];        }        printf("%.6lf\n",ans);    }return 0;}





0 0
原创粉丝点击