圣诞树(模拟)

题目描述
为了营造圣诞节欢快的气氛,大老板泽泽想在江北万达的门口摆放两棵圣诞树(不一定要一模一样)。圣诞树的制造商们可提供给他 n 棵圣诞树,每棵圣诞树都会有一个美丽值,需要用相应的货币购买。货币只能用人民币或美金(不能将人民币换成美金或将美金换成人民币)。每棵圣诞树一定要用规定数量的对应货币购买,也就是说有些树只能用人民币买,有些树只能用美金买(要看制造商们喜欢那种货币)。
如果大老板泽泽带了足够的货币去购买两棵圣诞树,你的任务是帮助泽泽找到两棵圣诞树,他们的美丽值之和最大。如果他无法买到两棵,则输出 0。

输入
第一行输入三个整数 n,c 和 d,n 表示制造商们提供的圣诞树总数,c 表示泽泽所带的人民币,d 表示泽泽所带的美金。
下面 n 行,每行描述一棵圣诞树:每行包含两个整数 bi 和 pi,分别表示第 i 棵圣诞树的美丽值和价格,(特别提醒:美丽值和价格之间用一个空格分隔),字母 “C”或“D”表示货币,其中 C 表示必须要用人民币购买,D 表示必须要用美金购买。(特别提醒:价格和货币之间用一个空格分隔)。

输出
输出泽泽可以购买的两棵圣诞树的最大美丽值之和。如果他不能购买两棵,则输出 0。

样例输入
【样例1】
3 8 7
10 9 C
3 4 C
5 7 D
【样例2】
2 6 1
2 5 C
2 5 D
【样例3】
3 10 10
4 5 C
6 5 C
10 11 D

样例输出
【样例1】
8
【样例2】
0
【样例3】
10

提示
样例一:泽泽无法购买第一棵圣诞树,因为他没有足够的人民币。他可以购买第二棵美丽值为 3 的圣诞树,需要付 4 人民币。此外,泽泽还可以购买第三棵美丽值为 5 的圣诞树,需要付 7 美金。 因此,两棵圣诞树的美丽值之和是 8。
样例二:有两棵圣诞树,但泽泽无法购买它们。因为他需要 5 美金购买第二棵圣诞树,而泽泽只有 1 美金,所以他不能买第二棵。

2<=n<=5000;
0<=c,d<=100000
1<=bi,pi<=100000

AC代码

#include 
#include 
#include 
#include 
 
using namespace std;
 
int n,c,d,ans;
 
struct tree_c{
 
    int value;
    int price;
 
};
 
struct tree_d{
 
    int value;
    int price;
 
};
 
vector<tree_c> array_c;
vector<tree_d> array_d;
 
bool cmp_c(const tree_c a,const tree_c b)
{
    if(a.value != b.value)
    {
        return a.value > b.value;
    }
    else
    {
        return a.price < b.price;
    }
}
 
bool cmp_d(const tree_d a,const tree_d b)
{
    if(a.value != b.value)
    {
        return a.value > b.value;
    }
    else
    {
        return a.price < b.price;
    }
}
 
void f()
{
    if(array_c.size()+array_d.size() < 2)
    {
        printf("0\n");
        return;
    }
    if(!array_c.empty() && !array_d.empty())
    {
        ans = array_c[0].value + array_d[0].value;
    }
    for(int i = 0; i < array_c.size(); i++)
    {
        int t = c-array_c[i].price;
        for(int j = 0; j < array_c.size(); j++)
        {
            if(i == j) continue;
            else
            {
                if(array_c[j].price <= t)
                {
                    ans = max(ans,array_c[i].value+array_c[j].value);
                }
            }
        }
    }
    for(int i = 0; i < array_d.size(); i++)
    {
        int t = d-array_d[i].price;
        for(int j = 0; j < array_d.size(); j++)
        {
            if(i == j) continue;
            else
            {
                if(array_d[j].price <= t)
                {
                    ans = max(ans,array_d[i].value+array_d[j].value);
                }
            }
        }
    }
    printf("%d\n",ans);
 
 
}
 
 
int main()
{
    cin >> n >> c >> d;
    while(n--)
    {
        int b,p;
        char type;
        cin >> b >> p >> type;
        if(type == 'C')
        {
            if(p > c) continue;
            tree_c tmp;
            tmp.price = p;
            tmp.value = b;
            array_c.push_back(tmp);
        }
        else
        {
            if(p > d) continue;
            tree_d tmp;
            tmp.price = p;
            tmp.value = b;
            array_d.push_back(tmp);
        }
    }
    sort(array_c.begin(),array_c.end(),cmp_c);
    sort(array_d.begin(),array_d.end(),cmp_d);
    /*
    for(int i = 0; i < array_c.size(); i++)
    {
        printf("value:%d price:%d\n",array_c[i].value,array_c[i].price,array_c[i]);
    }
    printf("\n");
    for(int i = 0; i < array_d.size(); i++)
    {
        printf("value:%d price:%d\n",array_d[i].value,array_d[i].price,array_d[i]);
    }
    */
    f();
    return 0;
}

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