题解:SP16248 NCLNE - Clones

· · 题解

题目大意

鸣人要进行战斗 n 秒,第 1 秒时,有 1 个鸣人,接下来每一秒,所有鸣人会先进行分身,从原来的 k 个鸣人变成 2k 个鸣人,分身以后,将会有一部分鸣人前往战斗,战斗的鸣人将不能分身,以此类推。现在给出总战斗时间 n 与每一秒前往战斗的鸣人数量,问给出的数据是否合法。

题目分析

通过题意可以得出,当 t \ne nk < 0,或者 t = nk \ne 0 时,数据不合法,上述表达式中 k 为每一秒部分鸣人去战斗后剩余鸣人数量,t 为此时时间(秒)。
此题使用模拟即可。

Code&AC记录

#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,n,people,flag,x;
signed main(){
    cin>>t;
    while(t--){
        cin>>n;
        people=flag=1;
        while(n--){
            cin>>x;
            if((people-=x)<0)flag=0;
            people*=2;
        }
        if(flag and !people)cout<<"Yes\n";
        else cout<<"No\n";
    }
    return 0;
}

后记

注意第 12 行的判断语句:

if((people-=x)<0)flag=0;

写代码时千万不要将 people-=x 两边的括号去掉,因为 > 的优先级显然高于 -=