| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
谁帮我看看思路(最小堆)输入完num和period之后建立最小堆,
然后每次输出堆顶,
并把堆中所有的元素的period减掉堆顶当前的period,
删掉堆顶,
恢复堆顶的period为输入时的period,重新添加进堆
直到输出k个
一直WA,我写了个暴力AC了,自己测试的时候两个程序的结果一样
代码:
#include<iostream>
using namespace std;
typedef struct
{
int num;
int p, op;
}Ins;
void MakeHeap(Ins a[], int n);
void addIns(Ins a[], int n, Ins b);
void FixUp(Ins a[],int i, int n);
Ins deleteIns(Ins a[], int n);
void FixDown(Ins a[], int i, int n);
void swap(Ins &a, Ins &b);
int main()
{
char input[20];
Ins a[2020];
int n;
int i = 0;
while( cin >> input)
{
if(input[0] == '#')
{
break;
}
cin >> a[i].num >> a[i].p;
a[i].op = a[i].p;
i++;
}
cin >> n;
MakeHeap(a, i);
Ins temp;
for(int j = 0; j < n; j++)
{
temp = deleteIns(a, i);
for(int k = 0; k < i-1; k++)
{
a[k].p -= temp.p;
}
cout << temp.num << endl;
temp.p = temp.op;
addIns(a, i-1, temp);
}
return 0;
}
void MakeHeap(Ins a[], int n) //n为数组个数
{
for(int i = n/2-1; i > -1; i--)
{
FixDown(a, i, n);
}
}
void addIns(Ins a[], int n, Ins b) //n为添加前数组个数
{
a[n] = b;
FixUp(a, n, n+1);
}
void FixUp(Ins a[],int i, int n) //i为新添加元素的位置,n为当前数组个数
{
for(; i > 0; i /= 2)
{
if(a[i].p < a[i/2].p)
{
swap(a[i], a[i/2]);
}
else if(a[i].p == a[i/2].p)
{
if(a[i].num < a[i/2].num)
{
swap(a[i], a[i/2]);
}
}
}
}
Ins deleteIns(Ins p[], int n) //n为当前数组个数
{
Ins temp = p[0];
p[0] = p[n-1];
FixDown(p, 0, n-1);
return temp;
}
void FixDown(Ins a[], int i, int n) //i为下移的元素位置,n为当前个数
{
int j = i*2 +1;
Ins temp = a[i];
while( j < n)
{
if(j+1 < n)
{
if(a[j].p > a[j+1].p)
{
j++;
}
else if(a[j].p == a[j+1].p && a[j].num > a[j+1].num)
{
j++;
}
}
if(a[j].p > temp.p)
{
break;
}
else if(a[j].p == temp.p && temp.num < a[j].num)
{
break;
}
a[i] = a[j];
i = j;
j = j * 2 +1;
}
a[i] = temp;
}
void swap(Ins &a, Ins &b)
{
Ins temp = a;
a = b;
b = temp;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator