芜湖市2018市队选拔Day2T1

好激动啊,Day2竟然AK了!

Day2T1养宠物

Description
badgers是可爱的动物,Smart想拥有一些。宠物店提供N个badgers,编号为1..N,Smart都很喜欢,所以他想拥有得越多越好。初始,每个badger每天需要固定量的食物。但是,如果它看见别的badger也在吃东西,它会觉得饥饿而吃更多的东西。一个badger每多一个同食者需要增加一个固定量的食物。
h[i]表示第i个badger单独进食所需要的食物。g[i]表示第i个badger在每多一个同食者的情况下增加的食物量。Smart每天最多可以供应totalFood量的食物,那么他最多可以养多少只badgers。
注意:Smart是把badgers放在一起养,所以每一只badger都能看到其他badger吃东西。


Input
第一行两个整数N和totalFood。
第二行N个整数,第i个为h[i]。
第三行N个整数,第i个为g[i]。


Output
一个整数,表示Smart最多可以养多少只badgers。

Sample Input
#1
3 7
1 2 3
2 2 1

#2
4 19
5 2 1 5
0 2 4 1

Sample Output
#12

#2
3
Hint

30%的数据:N≤10;
100%的数据:1≤N≤50,1≤h[i]≤1000,0≤g[i]≤1000,1≤totalFood≤1000000。


【题解】
    这题首先想到的是暴力。
    打一张表出来,其中f[i][j]是第i个动物在和j个人供餐时的食量。

    将数量从高到低枚举,按照当前数量i的饭量排升序之后选前i个。看看是否小于等于totalFood。如果是,输出并退出,否则继续枚举下一个时间。

【源代码】

 1 #include <cstdio>
 2 #include <algorithm>
 3 using namespace std;
 4 const int S=57;
 5 int n,m,s;
 6 struct info
 7 {
 8 int h,g;
 9 }a[S];
10 bool cmp(info a,info b)
11 {
12     return a.h<b.h;
13 }
14 int main()
15 {
16     scanf("%d%d",&n,&m);
17     for (int i=1;i<=n;i++)
18     scanf("%d",&a[i].h);
19     for (int i=1;i<=n;i++)
20     {
21         scanf("%d",&a[i].g);
22         a[i].h+=a[i].g*(n-1);
23     }
24     for (int i=n;i;i--)
25     {
26         sort(a+1,a+1+n,cmp);s=0;
27         for (int j=1;j<=i;j++)
28         s+=a[j].h;
29         if (s<=m)
30         {
31             printf("%d",i);
32             return 0;
33         }
34         for (int j=1;j<=n;j++)
35         a[j].h-=a[j].g;
36     }
37     puts("0");
38     return 0;
39 }

 (20180325)

原文地址:https://www.cnblogs.com/Algebra-hy/p/10376420.html