问题 G:[ECUST2018新生赛]花梨露营

题目描述

冬天到了,又到了出去玩的季节了(?@#$@!?)。小花梨和小信息一拍即合打算组织一场露营活动作为团日。
小信息一拍脑袋就上团少少买了一堆五花八门的燃料用于野炊。看着贴满‘爆’、‘辐射危害’、‘生物危害’的箱子,小花梨不禁感觉头皮发麻。
小花梨想选一种效果最好且不会招来消防大队的安全燃料。于是他向一位华东化工学院的前辈求助,前辈告诉他安全的燃料应该满足以下三点:
1、它至少含碳氢氧三种元素中的一或多种
2、它的分子中氢原子个数不会超过碳原子个数的两倍加二
3、它的分子中氢原子个数一定为偶数
(只要满足上述三点的燃料在本题中均认为安全燃料。)
“那我怎么分辨哪种燃料效率高呢?”——小花梨追问
“你知道热化学方程式么?比方说酒精燃烧,你可以简单理解为以下”
1C2H6O+3O2−→2CO2+3H2O+XkJ
“表示1mol(46g)酒精完全燃烧产生2mol二氧化碳和3mol水时会产生X千焦的热量。
而X的大小取决于在反应环境中,二氧化碳和水的生成热(kJ/mol)。
打个比方,如果二氧化碳的生成热是a,水的生成热是b,那么你可以认为1mol酒精完全燃烧释放的热量为(2a+3b)kJ,即(1mol)酒精的燃烧热为(2a+3b)kJ。”
“嗯嗯嗯(完全没懂)”——小花梨一脸懵逼
“如果只是去露营的话,选单位质量燃烧热最高的就行了。”——聊天结束
于是小花梨转向了聪明的你,你所需要做的,就是帮助小花梨在小信息买来的燃料中选取安全且单位质量燃烧热最高的一款。
(相对原子质量:C−12,O−16,H−1,题中燃料的燃烧热只和产物有关)

输入

第一行一个整数T,表示有T组数据,对于每组数据:
第一行三个整数n,a,b,表示小信息买的燃料总数和二氧化碳、水的生成热。
接下来n行,每行三个整数Xi,Yi,Zi,表示第i种燃料分子的化学式为CXiHYiOZi(即分子中碳、氢、氧原子个数)
(1≤T≤15,1≤n≤1000,0≤a,b≤100000,0≤Xi,Yi,Zi≤1000)

输出

对于每一组数据,输出"Case x: ans"(不含引号)
x表示第x组测试数据,从1开始编号,ans表示你所选择的燃料的化学式
每组数据保证有且仅有一组解。
化学式的输出规则如下:
1、按碳X氢Y氧Z的顺序输出,中间不要加空格
2、原子数只有1的时候不要输出原子数
3、没有出现的原子不要输出
正确输出样例:O2、CO2、CH4 错误输出样例:C1H4、H10C4、CH0

样例输入

3
2 393 242
1 4 1
2 6 1
5 1000 10
1 1 0
2 6 3
0 2 0
1 4 0
5 12 0
1 393 242
60 0 0

样例输出

Case 1: C2H6O
Case 2: C5H12
Case 3: C60

Code

//俺可是难得主动写函数啊,记录一下
#include <bits/stdc++.h>
using namespace std;

int ee[1010],X[1010],Y[1010],Z[1010];

int maxpos(){
    int pi=0,maxn=ee[0];
    for(int i=0;ee[i]!=-1;i++){
        if(ee[i]>maxn){
            pi=i;
            maxn=ee[i];
        }
    }
    return pi;
}

void print(int pi){
    if(X[pi]!=0){
        cout<<'C';
        if(X[pi]!=1) cout<<X[pi];
    }
    if(Y[pi]!=0){
        cout<<'H';
        if(Y[pi]!=1) cout<<Y[pi];
    }
    if(Z[pi]!=0){
        cout<<'O';
        if(Z[pi]!=1) cout<<Z[pi];
    }
    cout<<endl;
}

int main(){
    int t,num=1;
    cin>>t;
    while(t--){
        int n,a,b;
        cin>>n>>a>>b;
        memset(ee,-1,sizeof(ee));
        memset(X,-1,sizeof(X));
        memset(Y,-1,sizeof(Y));
        memset(Z,-1,sizeof(Z));
        int i=0;
        while(n--){
            int x,y,z;
            cin>>x>>y>>z;
            if(((x!=0)||(y!=0)||(z!=0))&&(y<=2*x+2)&&(y%2==0)){
                ee[i]=(x*a+y*b/2)/(12*x+y+16*z);
                X[i]=x;
                Y[i]=y;
                Z[i]=z;
                i++;
            }
            else continue;
        }
        cout<<"Case "<<num<<": ";
        print(maxpos());
        num++;
    }
    return 0;
}
发布了25 篇原创文章 · 获赞 5 · 访问量 1664

猜你喜欢

转载自blog.csdn.net/qq_43611144/article/details/104163910
今日推荐