HDU_1053 Entropy
16568 단어 HDU
#include <stdio.h>
#include <string.h>
#define N 128
#define inf 0x7fffffff
struct node
{
int val; //
int left, right, parent;
}p[1000];
int f[N]; //
int len[N]; //
void hufuman(int n)
{
int i, min1, min2, pos1, pos2, flag;
for(i =0; i < n; i++)
{
p[i].val = f[i];
p[i].parent =-1;
p[i].left =-1;
p[i].right =-1;
}
while(1) // Hufuman
{
int mark1 =0, mark2 =0;
min1 = min2 = inf;
for(i =0; i < n; i++) //
{
if(p[i].parent ==-1&& p[i].val < min1)
{
if(min1 != min2)
{
min2 = min1;
pos2 = pos1;
mark2 =1;
}
min1 = p[i].val;
pos1 = i;
mark1 =1;
}
elseif(p[i].parent ==-1&& p[i].val < min2)
{
min2 = p[i].val;
pos2 = i;
mark2 =1;
}
}
if(mark1 ==0|| mark2 ==0) // , Hufuman
break;
p[n].val = min1 + min2;
p[pos1].parent = n;
p[pos2].parent = n;
p[n].left = pos1;
p[n].right = pos2;
p[n].parent =-1;
n++;
}
for(i =0; i < n; i++)
{
if(p[i].right !=-1|| p[i].left !=-1) // , ,
break;
flag = i;
len[i] =1;
while(p[flag].parent !=-1)
{
len[i]++; // ( Hufuman , )
flag = p[flag].parent; // i ,
}
}
return;
}
int main()
{
char str[N];
int data[N], i;
while(gets(str) != NULL)
{
if(!strcmp(str, "END")) break;
memset(data, 0, sizeof(data));
memset(f, 0, sizeof(f));
for(i =0; i < strlen(str); i++)
data[(int)str[i]]++; //
int num =0;
for(i =0; i <128; i++)
{
if(data[i] !=0)
{
f[num++] = data[i]; // num, f[]
}
}
if(num ==1)
{
printf("%d %d 8.0
",strlen(str)*8, f[0]);
continue;
}
hufuman(num);
int sum =0;
for(i =0; i < num; i++)
{
if(len[i] !=1)
sum += (len[i]-1)*f[i]; // = sum( * )
}
printf("%d %d %.1f
", strlen(str)*8,sum, strlen(str)*8/(float)sum);
}
return0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[HDU] 4089 활성화 확률 DPdp[i][j]를 모두 i개인의 대기열인 Tomato가 j위 서버가 마비될 확률로 역추를 사용하면 우리는 상태 이동 방정식을 얻을 수 있다. i == 1 : dp[1][1] = dp[1][1] * p1 + dp[1]...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.