G题求解
我的思路是创建一个map,用while循环逐个将第a[i]个数导入map,导入的同时用m减去a[i],如果m<=0就找到map最大的那个数使用神力,当神力次数k为0,并且m<=0时就退出while循环
感觉思路没问题啊,就只能过64%,求大佬解惑
下面是我的代码:
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m,k,sum,cnt,a[200005],imx,nn;
void yezid() {
cin>>n>>m>>k;
cnt=0;//cnt为可以畅游的国家数
map<ll,ll>mp;
for(ll i=0; i<n; i++) {
cin>>a[i];
}
imx=0;//imx为下一个将要导入的下标
while(1) {
if ((k==0 and m<=a[imx]) or imx==n or cnt==n) break;
mp[a[imx]]++;//导入map
m-=a[imx];
while(k>0) {//一直使用神力直到m>0或者次数用尽
if (m>0) break;
auto it=mp.end();
it--;
m+=it->first;
it->second--;
k--;
}
if (m>0) {//m成功>0就是畅游成功
cnt++;
imx++;
} else break;
}
cout<<cnt<<'\n';
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
yezid();
return 0;
}