思路:一定是尽量将数量大于1的smile化成数量为1的smile,这里就可以使用二进制,然后位置为1的说明可以化成与原本的pow(2,j-1) (j代表在二进制中第几位),然后用set来存储放进去的smile的大小,因为该smile一定最多只存在一个,最后输出smile的大小就可以知道还剩几个
#include<iostream>
#include<set>
#include<map>
#include<queue>
#include<cmath>
#define ll long long
using namespace std;
const int maxn = 1e4 + 10;
ll a[maxn];
set<ll>S;
int main()
{
int n;
cin >> n;
while(n--)
{
ll s, c;
cin >> s >> c;
ll cnt = 0;
while (c)
{
a[cnt] = c % 2;
c /= 2;
cnt++;
}
for (int i = 0; i < cnt; i++)
{
ll temp = s * pow(2, i);
if (a[i])
{
if (S.count(temp) == 0)
{
S.insert(temp);
}
else
{
while (S.count(temp))
{
S.erase(temp);
temp *= 2;
}
S.insert(temp);
}
}
}
}
cout << S.size() << endl;
}