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;
}
#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;
}
相关文章推荐
- 2016 ACM/ICPC Asia Regional Qingdao Online hdu 5884 Sort (二分+优先队列)★
- 2016 ACM/ICPC Asia Regional Qingdao Online hdu 5884 Sort (智商+队列)★
- HDU 5884 Sort 2016 ACM/ICPC Asia Regional Qingdao Online 1007
- HDU 5881 Tea (水题) 2016 ACM/ICPC Asia Regional Qingdao Online
- HDU 5883 The Best Path 2016 ACM/ICPC Asia Regional Qingdao Online
- hdu--5878(hdu 5878 I Count Two Three (2016 ACM/ICPC Asia Regional Qingdao Online 1001))
- HDU 5879 Cure 2016 ACM/ICPC Asia Regional Qingdao Online
- HDU 5879 Cure(技巧)——2016 ACM/ICPC Asia Regional Qingdao Online
- HDU 5882 Balanced Game(其实间接考查了欧拉回路)——2016 ACM/ICPC Asia Regional Qingdao Online
- HDU 5889 Barricade 【BFS+最小割 网络流】(2016 ACM/ICPC Asia Regional Qingdao Online)
- HDU 5878 I Count Two Three (2016 ACM/ICPC Asia Regional Qingdao Online 1001)
- HDU 5878 -- 丑数打表(2016 ACM/ICPC Asia Regional Qingdao Online)
- HDU 5882 Balanced Game 2016 ACM/ICPC Asia Regional Qingdao Online 1005
- HDU 5889 Barricade (最小割) 2016 ACM/ICPC Asia Regional Qingdao Online
- 欧拉路——HDU 5883 (2016 ACM/ICPC Asia Regional Qingdao Online 1006)
- hdu 5878 I Count Two Three (2016 ACM/ICPC Asia Regional Qingdao Online 1001)
- 2016 ACM/ICPC Asia Regional Qingdao Online hdu 5889 Barricade (最短路+最小割)
- 2016 ACM/ICPC Asia Regional Qingdao Online hdu 5881 Tea (模拟构造)★
- HDU 5879 Cure 2016 ACM/ICPC Asia Regional Qingdao Online 1002
- HDU 5881 Tea(思维)——2016 ACM/ICPC Asia Regional Qingdao Online