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;
}
代码:
#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 5884 Sort(哈夫曼树+二分)
- hdu 5884 Sort 二分+K哈夫曼树(解决不单调问题) 队列优化
- hdu 5884 Sort 二分+哈夫曼树(解决不单调问题) 队列优化
- hdu 5884- Sort 哈夫曼树构造 + 模拟优先队列 + 二分
- hdu 5884 Sort(二分+哈夫曼树(队列))
- HDU-5884-Sort-二分加多叉哈夫曼树
- HDU 5884 Sort(2016年青岛网络赛 G 二分+贪心+小优化)
- HDU 5884-Sort(队列+二分)
- HDU 5884 Sort(二分加双队列优化)
- HDU 5884 Sort (二分)
- HDU 5884 Sort 2分 K叉哈夫曼树
- 2016 ACM/ICPC Asia Regional Qingdao Online hdu 5884 Sort (二分+优先队列)★
- hdu_5884_Sort(二分+单调队列)
- hdu 5884 Sort 二分 + K叉哈夫曼树 两个队列
- HDU 5884 Sort (二分+双队列)
- HDU 5884 Sort(二分+单调队列)
- HDU 5884 Sort 多叉哈夫曼树 -
- HDU 5884 Sort(二分+优先队列)
- Hdu-5884 Sort(k叉哈夫曼树)