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
}