n个数,每个数可以/2若干次,最后转换为1-n,说明每个数和最后的目标一对一
一个数一开始大于n,则必须要操作至小于等于n,然后存到cnt[i]
按照n->1的顺序看,如果cnt[i]==0,则必没有数可以转化为i
如果cnt[i]>1,则只需要一个转化为cnt[i],剩下的所有已经转化为i的数,继续操作至i/2
#include<cstdio> #include<cstdlib> #include<vector> #include<cmath> using namespace std; inline int read() { int x=0;char c=getchar(); while(c<'0' || c>'9' ) c=getchar(); while(c>='0'&&c<='9' ) x=(x<<3)+(x<<1)+c-'0',c=getchar(); return x; } int T,n; const int N=60; int cnt[N]; int main() { T=read(); while(T--) { n=read(); for(int i=1;i<=n;i++) cnt[i]=0; for(int i=1;i<=n;i++) { int x=read(); while(x>n ) x>>=1; cnt[x]++; } bool fail=false; for(int i=n;i>0 && !fail;i--) { if(!cnt[i] ) { //printf(" %d %d\n",n,i); fail=true; } if(cnt[i]>1 ) cnt[i>>1]+=cnt[i]-1; } if(!fail ) printf("YES\n"); else printf("NO\n"); } return 0; }View Code