gdfzoj #560 Maple吃饺子

这就是一道水题,不过不容易看出来。。。
原题链接:http://www.gdfzoj.com/oj/contest/128/problems/3
标签:水题
Problem Description
Maple非常喜欢吃南亭的黑龙江饺子店的饺子,人均二十块左右就可以吃得超饱。
黑龙江饺子里面一共有n种饺子,现在Maple需要在里面选几种来吃,因为Maple想吃尽量多不同的饺子,所以每种饺子Maple最多只会点一份。
每个饺子都有两个属性,一个是肥宅指数a[i],一个是反肥宅指数b[i]。
Maple在点菜的时候,每把一份饺子加入菜单里面,所有的饺子的肥宅指数就会下降B[I](包括已经写入菜单的那些,还有当前这一份,还有还没写入菜单那些),点完菜后,菜单会被送进厨房,当Maple吃完这些饺子的时候(一定可以全部吃完),就会获得这些肥宅指数,现在问Maple所能获得最大的肥宅指数是多少。

Input
第一行一个整数n。
接下来有n行,每行有两个整数a[i],b[i],分别表示每个饺子的肥宅指数的初始值,和反肥宅指数的值
20%的数据n<=20
100%的数据n<=1000,0<=a[i],b[i]<=1000000000

Output
一个整数,表示Maple所能获得的最大的肥宅指数。

Sample Input
3
10 0
5 2
7 4

Sample Output
11
这道题的思路很简单:就是枚举吃1~n个饺子,吃第k个饺子的代价就是a[k]-b[k]*i,排一遍序,连dp都不用。附上代码

#include
#include
#define maxn 1050
typedef long long ll;
using namespace std;
ll n,i,j,a[maxn],b[maxn],c[maxn],ans,tmp;
bool cmp(ll x,ll y)
{
    return (x>y);
}
int main()
{
    scanf("%lld",&n);
    for (i=1;i<=n;i++) scanf("%lld%lld",&a[i],&b[i]); ans=-2147483647;
    for (int ii=1;ii<=n;ii++) 
    {
        for (j=1;j<=n;j++) c[j]=a[j]-b[j]*ii;
        sort(c+1,c+1+n,cmp);
        tmp=0; 
        for (j=1;j<=ii;j++) tmp+=c[j];
        if (tmp>ans) ans=tmp;
    }
    printf("%lld",ans);
    return 0;
}

你可能感兴趣的:(水题)