1. 程式人生 > >【51nod 1785】數據流中的算法

【51nod 1785】數據流中的算法

分享 col esc == namespace 大小 小數 cnblogs -a

Description

51nod近日上線了用戶滿意度檢測工具,使用高級人工智能算法,通過用戶訪問時間、鼠標軌跡等特征計算用戶對於網站的滿意程度。 現有的統計工具只能統計某一個窗口中,用戶的滿意程度的均值。夾克老爺想讓你為統計工具添加一個新feature,即在統計均值的同時,計算窗口中滿意程度的標準差和中位數(均值需要向下取整)。

Input

第一行是整數n與k,代表有n次操作,時間窗口大小為k。 
(1 <= n <= 10^6, 1 <= k <= 100)

接下來的n行,每行代表一次操作。操作有“用戶訪問”、“查詢均值”、“查詢方差”、“查詢中位數”四種。每行的第一個數代表操作類型。

操作數1:用戶訪問
輸入格式:<1, v>
用戶的滿意度v為閉區間[0, 100]中的任意整數。用戶每訪問一次,數據更新,移動統計窗口。

操作數2:查詢均值
輸入格式:<2>
統計窗口內的用戶滿意度的均值。

操作數3:查詢方差
輸入格式:<3>
統計窗口內用戶滿意度的方差

操作數4:查詢中位數
輸入格式:<4>
統計窗口內用戶滿意度的中位數

p.s. 在有查詢請求時,窗口保證不為空
p.s.s. 有查詢請求時,窗口可能不滿

Output

對於“查詢均值”、“查詢方差”、“查詢中位數”操作的結果,輸出保留兩位小數。

Input示例

12 3
1 1
1 2
1 3
2
3
4
1 4
1 5
1 6
2
3
4

Output示例

2.00
0.67
2.00
5.00
0.67
5.00


其實難度主要在中位數……感謝隔壁大佬的思路。
因為v為閉區間[0, 100]中的任意整數,所以開個桶存一下就好了,每次查詢中位數時,從0開始向後掃。

技術分享
 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cmath>
 5
using namespace std; 6 int n,sum,p,num,k,now,cnt,s[105],a[1000050]; 7 int read() 8 { 9 int x=0,f=1;char c=getchar(); 10 while(c<0||c>9){if(c==-)f=-1;c=getchar();} 11 while(c>=0&&c<=9){x=x*10+c-0;c=getchar();} 12 return x*f; 13 } 14 int main() 15 { 16 n=read();k=read();
17 while(n--) 18 { 19 p=read(); 20 if(p==1) 21 { 22 num=read(); 23 a[++cnt]=num; 24 if(now==k)sum=sum-a[cnt-k]+num,s[a[cnt-k]]--; 25 else now++,sum+=num; 26 s[num]++; 27 } 28 else if(p==2)printf("%.2lf\n",floor((double)sum/now)); 29 else if(p==3) 30 { 31 double w=(double)sum/now,ans=0; 32 for(int i=cnt-now+1;i<=cnt;i++)ans+=((double)a[i]-w)*((double)a[i]-w); 33 printf("%.2lf\n",ans/now); 34 } 35 else 36 { 37 if(now%2) 38 { 39 int pos=now/2+1,ans=0; 40 for(int i=0;i<=100;i++) 41 { 42 ans+=s[i]; 43 if(ans>=pos) 44 { 45 printf("%.2lf\n",(double)i); 46 break; 47 } 48 } 49 } 50 else 51 { 52 int pos1=now/2,pos2=now/2+1,st=-1,ed=-1,ans=0; 53 for(int i=0;i<=100;i++) 54 { 55 ans+=s[i]; 56 if(ans>=pos1&&st==-1)st=i; 57 if(ans>=pos2&&ed==-1)ed=i; 58 if(st!=-1&&ed!=-1) 59 { 60 printf("%.2lf\n",(double)(st+ed)/2); 61 break; 62 } 63 } 64 } 65 } 66 } 67 return 0; 68 }
View Code

 

【51nod 1785】數據流中的算法