题意:一数列an,如果存在一个k,有2^(ai)+2^(aj)+......=2^k成立,那么一次能拿走ai,aj这些全部。问最少拿的次数。
太简单。
乱码
//#pragma comment(linker,"/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<vector> #include<cmath> #include<queue> #include<stack> #include<map> #include<set> #include<algorithm> #include <stack> #include <ctime> #include <iomanip> using namespace std; const int SZ=2000010,INF=0x7FFFFFFF; typedef long long lon; lon num[SZ]; int main() { std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); int n; //for(;cin>>n,n;) { cin>>n; for(int i=0;i<n;++i) { int tmp; cin>>tmp; ++num[tmp]; } for(int i=0;i<SZ;++i) { num[i+1]+=num[i]/2; num[i]=(num[i]&1); } // for(int i=0;i<SZ;++i) // { // if(num[i])cout<<i<<" "; // }cout<<endl; int res=count(num,num+SZ,1); cout<<res<<endl; } return 0; }