您的位置:首页 > 其它

HDU 5884 Sort (二分 贪心(k叉哈夫曼树))

2017-09-15 23:49 573 查看
官方题解:



代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+5;
int a[maxn];
int n, T;

namespace fastIO {
#define BUF_SIZE 1000000
//fread -> read
bool IOerror = 0;
inline char nc() {
static char buf[BUF_SIZE], *p1 = buf + BUF_SIZE, *pend = buf + BUF_SIZE;
if(p1 == pend) {
p1 = buf;
pend = buf + fread(buf, 1, BUF_SIZE, stdin);
if(pend == p1) {
IOerror = 1;
return -1;
}
}
return *p1++;
}
inline bool blank(char ch) {
return ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t';
}
inline void read(int &x) {
char ch;
while(blank(ch = nc()));
if(IOerror)
return;
for(x = ch - '0'; (ch = nc()) >= '0' && ch <= '9'; x = x * 10 + ch - '0');
}
#undef BUF_SIZE
};
using namespace fastIO;

bool judge(int x)
{
priority_queue<int, vector<int>, greater<int> > pq;
int cost = 0, s = 0;
s = (n-1)%(x-1);
if((n-1)%(x-1))
{
s++;
int tmp = 0;
for(int i = 1; i <= (n-1)%(x-1)+1; i++)
{
cost += a[i];
if(cost > T) return 0;
tmp += a[i];
}
pq.push(tmp);
}
for(int i = s+1; i <= n; i++)
pq.push(a[i]);
while(pq.size() >= x)
{
int num = x;
int tmp = 0;
while(num--)
{
cost += pq.top();
if(cost > T) return 0;
tmp += pq.top();
pq.pop();
}
pq.push(tmp);
}
if(cost > T) return 0;
return 1;
}

int main(void)
{
int _;
read(_);
while(_--)
{
read(n);
read(T);
for(int i = 1; i <= n; i++)
read(a[i]);
sort(a+1, a+1+n);
int ans = 0, l = 2, r = n;
while(l <= r)
{
int mid = (l+r)/2;
if(judge(mid)) r = mid-1, ans = mid;
else l = mid+1;
}
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  HDU 多校 二分 贪心