涼肝的比賽

對於這場比賽,我真的是有點划水了,作了倆題,作第三題的時候實在是不知道什麼地方卡住了,而後我家來了客人,被帶出去吃飯去了,ε=(´ο`*)))唉!!!c++

B - Just Eat It!

這道題是個經典的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;
        }
    }
}

 

E - Deadline

 

這題看起來挺簡單的,可是這個數學問題的解法比賽的時候我是怎麼都沒想到,比賽的時候也是匆匆看了一眼就去看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;
    }
}    
相關文章
相關標籤/搜索