Safe Or Unsafe
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
void swap(int &a,int &b);
void put(int heap[],int num,int &len);
int get(int heap[],int &len);
int main()
{
int n,m,len,i,len1,len2,a,b;
int num[26];
int heap[40];
int toal;
string str;
cin>>n;
while(n--)
{
cin>>m;
cin>>str;
len=0;
toal=0;
memset(num,0,sizeof(num));
len1=str.length();
for(i=0;i<len1;++i)
num[str[i]-'a']++;
for(i=0;i<26;++i)
if(num[i])
put(heap,num[i],len);
len2=len;
if(len==1)
toal=get(heap,len);
else
{
for(i=0;i<len2-1;++i)
{
a=get(heap,len);
b=get(heap,len);
toal+=a+b;
put(heap,a+b,len);
}
}
if(toal<=m)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
}
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
void put(int heap[],int num,int &len)
{
++len;
heap[len]=num;
int son=len;
while(son!=1&&heap[son]<heap[son/2])
{
swap(heap[son],heap[son/2]);
son/=2;
}
}
int get(int heap[],int &len)
{
int min=heap[1];
heap[1]=heap[len];
--len;
int son=1;
while(son*2<=len)
{
if(son*2+1>len||heap[son*2]<heap[son*2+1])
son=son*2;
else
son=son*2+1;
if(heap[son/2]>heap[son])
swap(heap[son/2],heap[son]);
else
break;
}
return min;
}
浙公网安备 33010602011771号