c++问题啊好难好难

描述
查看信息
国王派你出来搜集一种漂亮的宝石,可是无奈这种宝石太过稀有,整个大陆上只有一个“黑心”市场有货,这处市场有 n 家商户,每家都售卖这种宝石,你非常开心,但是市场上有一个规则:

在任意一家商户都可以买到这种宝石,并且无限供应(但一次只能买 1 颗),初始售价 ai 由商户自己决定,不过每次商户卖掉 1 颗宝石后,都要把价格涨为原来的 2 倍。

现在你身上带了 x 元钱,最多能买走多少颗宝石?

输入格式
第一行两个整数 n 和 x ,表示商户的数目和身上的钱数。

第二行 n 个整数,表示每一家商户的宝石初始售价 ai 。

输出格式
一个整数,表示最多能买走多少颗宝石。

样例输入
3 10
1 2 3
样例输出
4
问题提示
【说明/提示】

第1家:1元,涨价为2元

第2家:2元,涨价为4元

第1家:2元,涨价为4元

第3家:3元,涨价为6元

【数据范围】

对于 30% 的数据:1≤n≤100 ,1≤ai≤10 ,1≤x≤106 ;

对于 60% 的数据:1≤n≤105 ,1≤ai≤104 ,1≤x≤109 ;

对于 100% 的数据:1≤n≤105 ,1≤ai≤109 ,1≤x≤1018 ;
想看一下代码

这个问题其实就是考你数组和排序,其使用枚举算法就能很快解决,就是会出一点小问题。以下是我的代码:

#include <iostream>
using namespace std;

int n,x,ai[106];        //全局变量:店铺数量,钱的数量,每个店铺的初始价格 

void putin(){        //输入部分函数,无返回值 
    cin >> n >> x;
    for (int i = 0;i < n;i ++){
        cin >> ai[i];
    }
}

int paixu(int s[106],int y){        //进行排序,返回值为最便宜店面的价格 
    int t; 
    for (int i = 0;i < y;i ++){
        for (int j = 0;j < y - i;j ++){
            if (s[j + 1] < s[j]){
                t = s[j];
                s[j] = s[j + 1];
                s[j + 1] = t; 
            }
        }
    }
    return s[1];
}

void zhuanhuan(int s[106],int y){
    for (int i = 1;i < y;i ++){        //将s数组里面的内容装入全局数组ai中以便转换 
        ai[i] = s[i];
    }
}

int buydiamond1(int an,int ax){        //购买函数1,返回值为能够购买的宝石数量diam 
    int list[an];
    int diam = 0;
    for (int i = 0;i < an;i ++){
        list[i] = ai[i]; 
    }
    for (int i = 0;ax >= paixu(ai,an);i ++){
        if (list[i] == paixu(ai,an)){
            diam ++;
            ax -= list[i];
            list[i] *= 2;
            zhuanhuan(list,an);
            for (int i = 0;i < an;i ++){
                ai[i] = list[i]; 
            }
        }
    }
    return diam;
}

int buydiamond2(int an,int ax){        //购买函数2,返回值为能够购买的宝石数量diam 
    int diam = 0;
    for (int i = 0;ax >= paixu(ai,an);i ++){
        if (ai[i] == paixu(ai,an)){
            diam ++;
            ax -= ai[i];
            ai[i] *= 2;
        }
    }
    return diam;
}

int main(){
    int diam;
    bool tof;
    putin();
    for (int i = 1;i < n;i ++){
        if (ai[n - 1] == ai[n]) tof = false;
        else tof = true;
    }
    if (tof){
        diam = buydiamond1(n,x);    
    }
    else{
        diam = buydiamond2(n,x);
    }
    cout << diam;
    return 0;
}

你看可以不?