對於這場比賽,我真的是有點划水了,作了倆題,作第三題的時候實在是不知道什麼地方卡住了,而後我家來了客人,被帶出去吃飯去了,ε=(´ο`*)))唉!!!c++
這道題是個經典的DP題,我對於遞推還不是特別熟悉,得找到題目的狀態轉移方程。算法
B[ i ] = max{ A[ i ] , B[ i - 1] + A[ i ] };數組
令B[ i ]表示以A[ i ]做爲末尾的連續序列的最大和,經過設置一個B數組,數組最大連續子序列和其實就是B數組裏的最大值,還有就是找到的最大值有可能也是全部的總和,因此先設置一個數,讓它統計已經連續了多少,對於這種狀況進行排除,而後對先前求出的總和進行比較,就能獲得答案。spa
(這個方法我是從算法筆記上看到的,還有太多沒看了...)code
#include<bits/stdc++.h> using namespace std; const int xa=2e5+5; long long a[xa],b[xa]; int main() { int t; cin>>t; long long n; long long sum; long long shu; bool pan; while(t--){ cin>>n; sum=0; shu=0; pan=false; for(int i=0;i<n;i++){ cin>>a[i]; sum+=a[i]; } b[0]=a[0]; for(int i=1;i<n-1;i++){ if(a[i]<=b[i-1]+a[i]){ b[i]=b[i-1]+a[i]; shu++; }else{ b[i]=a[i]; shu=0; } } if(shu==n){ pan=true; } int k=0; for(int i=1;i<n;i++){ if(b[i]>b[k]){ k=i; } } if(b[k]>=sum&&!pan){ cout<<"NO"<<endl; }else{ cout<<"YES"<<endl; } } }
這題看起來挺簡單的,可是這個數學問題的解法比賽的時候我是怎麼都沒想到,比賽的時候也是匆匆看了一眼就去看B題去了。blog
聽大佬們說這個題是均值不等式ci
由題意得,n>=x+[d/(x+1)]=x+1[d/(x+1)]-1>=2sqrt(d)-1;數學
因此就解出來了 ~。~ it
嗚嗚嗚~~class
#include<bits/stdc++.h> using namespace std; int t; long long n,d; int main(){ cin>>t; while(t--){ cin>>n>>d; if((n+1)*(n+1)/4>=d) cout<<"YES"<<endl; else cout<<"NO"<<endl; } }