Codeforces Round #814 B

B. Fibonacci Strings

观察斐波那契数列
发现他们是相邻之间都有“进位”的 比如 a + b = c
按照题目要求我们对于一个数来说 我们为了不选相邻的背包
我们显然要贪心的选大的 这样 我们才不会出现选a+b==c的情况
所以我们直接贪心 将所有的c[i]放进优先队列
然后大的背包要大的来填满
为了要求途中合法性 我们不能马上的放进去 这样容易选到相邻的
我们得等一回合再把他放进去
最后我们判断无解就是要是为负就是无解

void solve(){
    vector<int>a;
    a.push_back(1);
    a.push_back(1);
    int sum=2;
    while(1){
        if(sum>=1e11)break;
        a.push_back(a.back()+a[a.size()-2]);
        sum+=a.back();
    }
    vector<int>s=a;
    for(int i=1;i<s.size();i++)s[i]+=s[i-1];
    int n;cin>>n;
    vector<int>c(n+1);
    sum=0;
    priority_queue<int>pq;
    for(int i=1;i<=n;i++)cin>>c[i],sum+=c[i],pq.push(c[i]);
    if(*lower_bound(all(s),sum)==sum){
        int pre=-1;
        n=lower_bound(all(s),sum)-s.begin();
        for(int i=n;i>=0;i--){
            if(pq.empty()){NO return;}
            auto t=pq.top();pq.pop();
            t-=a[i];
            if(t<0){NO return;}
            if(pre!=-1)pq.push(pre);
            pre=t;
        }
        YES
    }else NO
}
posted @ 2022-11-28 22:11  ycllz  阅读(30)  评论(0)    收藏  举报