http://acm.whu.edu.cn/land/problem/detail?problem_id=1537
告诉你n个物品, n<=1000, 每个物品有两个值a和b, 每选择一个物品, 所有物品包括这件选中的物品的a 就要减去这件选中物品的 b值,问你选中物品的a的总和Max最大为是多少。
主要是看题面的条件, 既然n<=1000就可能存在O(n^2)复杂度的解。
由于物品数不会超过1000, 就可以枚举放入的物品总数x, 用n^2的复杂度解决问题。
首先从1到n枚举放入的物品总数为x,那么假如放了第k件物品,就可以使得总收益增加a[k]-b[k]*x,所以就对所有n件物品按a[k]-b[k]*x从大到小排一个序,再将前x件物品计算好,更新一下Max。最后把Max输出来。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1100;
struct node
{
int a, b;
}no[maxn];
int num;
bool cmp(const node &x, const node &y)
{
return x.a - x.b * num > y.a - y.b * num;
}
int main()
{
// freopen("data.in", "r", stdin);
int ans, n, sum;
while(scanf("%d", &n) != EOF && n != 0)
{
for(int i = 0; i < n; i++)
scanf("%d%d", &no[i].a, &no[i].b);
ans = 0;
for(num = 1; num <= n; num++)
{
sort(no, no+n, cmp);
sum = 0;
for(int i = 0; i < num; i++)
{
sum += (no[i].a - no[i].b * num);
}
ans = max(ans, sum);
}
printf("%d\n", ans);
}
return 0;
}