思路

本题我们可以这么想:

我们可以先把每个口罩用的不舒适度极限(即不超过 kk)的每天的不舒适度存入数组。举个例子:如果 a1=2a_1=2 ,k=30k=30,那么我们将存入数组中:2 4 8 16。

存完以后,我们将数组sort一下,就得到了从小往大的使用不舒适度排序(因为不舒适度不会减少,所以可以保证再用一次的不舒适度一定是按顺序排列的)。

接下来我们使用while循环,计算使用天数。

这样一来这题是不是很简单呢?

codecode

#include<bits/stdc++.h>
using namespace std;
int a[10000001],p[100001];
int k,n,ans,t=1,i=0;
int main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++) cin>>p[i];//输入不多讲
    for(int j=1;j<=n;j++){//开始存不舒适度
        while(p[j]<=k){//每个口罩使用的极限
            a[t]=p[j];
            p[j]*=2;//不舒适度翻倍存入数组中
            t++;//数组项数++
        }
    }
    t--;//用while的话t回多出来1这是一个需要注意的点
    sort(a+1,a+t+1);;
    while(ans<=k){
        ans+=a[i];
        i++;//i为天数
    }
    i-=1;//由于会多算一天所以这里-1
    cout<<i;
    return 0;
}