日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

二分算法:平均值(洛谷 UVA1451)

發(fā)布時(shí)間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二分算法:平均值(洛谷 UVA1451) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

解析

這道題尋找平均值的max,答案明顯具有單調(diào)性,所以采用二分算法
從0到1不斷取中點(diǎn)mid作為平均值的可能點(diǎn),看是否存在不短于l的數(shù)列均值>=mid不難得到以下代碼:

double st=0,ed=1;for(int i=1;i<=10;i++){double mid=(st+ed)/2;if(check(mid)) st=mid;else ed=mid;}

現(xiàn)在的問(wèn)題就是要解決這個(gè)check函數(shù)的寫(xiě)法了
因?yàn)镹范圍到1e5,暴力的On方肯定是會(huì)超的
我們想到可以先把數(shù)組都減mid,這樣就轉(zhuǎn)化為是否存在不短于L的數(shù)列加和大于等于0的問(wèn)題
我們用s[i]表示1到i的加和
那么a到b的和可以轉(zhuǎn)化為s[b] - s[a-1](其中b-a+1 >=l)
要使s[b] - s[a-1]最大,就要使s[a-1]取的是s[0]到s[b-l+1]的最大值
而隨著b從l循環(huán)到n,每次s[a-1]只加入了一個(gè)可能取的元素,故只需與該新值取min,不必遍歷
代碼如下:

double mn=M;for(int i=l;i<=n;i++){mn=min(mn,s[i-l]);if(s[i]-mn>=0) return true;//只要存在就返回true }return false;

這樣check函數(shù)的時(shí)間復(fù)雜度就為O(n)

AC快樂(lè)~~~~~~

代碼

#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int M = 2e9; int n,l,t; int zuo,you; int f[100500]; bool check(double x){double s[100500]={ };s[1]=f[1] - x;for(int i=2;i<=n;i++){s[i] = s[i-1] + f[i] -x;//求減完x的前綴和 }double mn=M;for(int i=l;i<=n;i++){mn=min(mn,s[i-l]);if(s[i]-mn>=0) return true;//只要存在就返回true }return false; } int main(){scanf("%d",&t);for(int k=1;k<=t;k++){scanf("%d%d",&n,&l);for(int i=1;i<=n;i++){scanf("%1d",&f[i]);}double st=0,ed=1;for(int i=1;i<=10;i++){double mid=(st+ed)/2;if(check(mid)) st=mid;else ed=mid;}double x=st;double s[100500]={ };s[1]=f[1] - x;for(int i=2;i<=n;i++){s[i] = s[i-1] + f[i] -x;}int a,flag=0;double mn=M;for(int i=l;i<=n;i++){if(mn>s[i-l]){mn=s[i-l];a=i-l;}if(s[i]-mn>=0){if(flag==0){zuo=a+1;you=i;flag=1;}else if(you-zuo>i-a){zuo=a+1;you=i;}}}printf("%d %d\n",zuo,you);}return 0; }

祝大家rp++!

總結(jié)

以上是生活随笔為你收集整理的二分算法:平均值(洛谷 UVA1451)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。