您的位置:首页 > 其它

CodeForces 3B Lorry

2012-11-26 19:14 260 查看
  原题链接:http://codeforces.com/problemset/problem/3/B

  看了好久才明白题意:有一辆卡车,要装载一些船只,这些船只分为“1”和“2”两种,再给出n只船的类型及其capacity(理解为“价值”会更好),要求给定卡车容量v的情况下求最大装载价值。

  理解完题意之后我想是背包问题吧,但是所给v达到10^9。

  其实这道题用的是贪心思想。

  首先把两种船只分开,分别进行排序。最优解总是先取价值高的。可以O(n)的时间复杂度枚举选择i只“1”船,则选择“2”船只的个数就是min((v - i) / 2, tc),tc为“2”船总个数,后面的处理就不难了。

View Code

#include <stdio.h>
#include <string.h>
#include <algorithm>
#define FOR(i,s,t) for(int i = (s); i <= (t); i++)
const int maxn = 100000 + 5;
int sum1[maxn], sum2[maxn], oc, tc, ans[maxn];

struct node
{
int id;
int val;
}one[maxn], two[maxn];

bool cmp(node x, node y)
{return x.val > y.val;}

int main()
{
int n, v, a, b, maxv, c1, c2;
while(scanf("%d%d", &n, &v) != EOF)
{
oc = tc = 0;
FOR(i, 1, n)
{
scanf("%d%d", &a, &b);
if(a == 1)
one[++oc].val = b, one[oc].id = i;
else
two[++tc].val = b, two[tc].id = i;
}
std::sort(one+1, one + oc + 1, cmp);
std::sort(two+1, two + tc + 1, cmp);
sum2[0] = sum1[0] = 0;
FOR(i, 1, tc) sum2[i] = sum2[i - 1] + two[i].val;
FOR(i, 1, oc) sum1[i] = sum1[i - 1] + one[i].val;
c1 = -1, c2 = -1, maxv = -1;
FOR(i, 0, oc)
{
if(i > v)
break;
int d = sum1[i] + sum2[std::min((v - i) / 2, tc)];
if(d > maxv)
{
maxv = d;
c1 = i;
c2 = std::min((v - i) / 2, tc);
}
}
if(maxv == -1)
{
puts("0");
continue;
}
int cnt = 0;
printf("%d\n", maxv);
FOR(i, 1, c1) ans[++cnt] = one[i].id;
FOR(i, 1, c2) ans[++cnt] = two[i].id;
FOR(i, 1, cnt)
printf("%d%c", ans[i], i == cnt? '\n' : ' ');
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: