您的位置:首页 > 其它

HDU 5884 Sort 2016 ACM/ICPC Asia Regional Qingdao Online

2016-09-17 19:05 471 查看
题目点我点我点我

#include<stdio.h>
#include<iostream>
#include<memory.h>
#include<stdlib.h>
#include<cstdio>
#include<cstring>
#include<queue>
#include<set>
#include<algorithm>
using namespace std;
const int MAXN = 100005;
const int INF = 0x3f3f3f3f;
typedef long long LL;
int T, N, M;
int a[MAXN], b[MAXN];
bool Check(int k)
{
int ai, bi, blen;
blen = 0;
ai = bi = 0;
int cost = 0;
bool first = true;
while (N - ai + blen - bi > 1)
{
int num = 0;
if (first)
{
if ((N - k) % (k - 1) == 0)
{
num = k;
}
else
{
num = (N - k) % (k - 1) + 1;
}
first = false;
}
else
{
num = k;
}
int sum = 0;
while (num--)
{
if (ai == N)
{
sum += b[bi];
bi++;
}
else if (bi == blen)
{
sum += a[ai];
ai++;
}
else if (a[ai] < b[bi])
{
sum += a[ai];
ai++;
}
else
{
sum += b[bi];
bi++;
}
}
cost += sum;
if (cost > M)
{
return false;
}
b[blen++] = sum;
}
return cost <= M;
}
int main(void) {
#ifndef ONLINE_JUDGE
//freopen("in.txt", "r", stdin);
#endif
int T;
scanf("%d", &T);
{
int i;
for (int ca = 1; ca <= T; ca++)
{
scanf("%d%d", &N, &M);
for (i = 0; i < N; i++)
{
scanf("%d", &a[i]);
}
sort(a, a + N);
int head = 2;
int tail = N;
int mid, res;
while (head <= tail)
{
mid = (head + tail) / 2;
if (Check(mid))
{
res = mid;
tail = mid - 1;
}
else
{
head = mid + 1;
}
}
printf("%d\n", res);
}

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐