#include <iostream>
using namespace std;
int a[15];
int main()
{
for(int i = 1; i <= 10; i++) cin >> a[i];
int n; cin >> n; n += 30;
int ret = 0;
for(int i = 1; i <= 10; i++)
{
if(a[i] <= n)
ret++;
}
cout << ret << endl;
return 0;
}
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 5010;
int n, s;
int a, b;
int cnt;
int t[N];
int main()
{
cin >> n >> s;
cin >> a >> b;
a += b;
for(int i = 1; i <= n; i++)
{
int x, y; cin >> x >> y;
if(x <= a) t[++cnt] = y;
}
sort(t + 1, t + 1 + cnt);
int ret = 0, sum = 0;
for(int i = 1; i <= n; i++)
{
sum += t[i];
if(sum <= s) ret++;
}
cout << ret << endl;
return 0;
}
对所有音阶的敲击次数做一次「前缀和」,那么前缀和数组中每一个位置 f i fi fi 表示:第 i i i 个音符「结束的时刻」。
那么对于每一次询问 t t t ,我们在前缀和数组中二分出 「 > t >t >t 的第一个位置」的下标,就是结果。
参考代码:
cpp复制代码
#include <iostream>
using namespace std;
const int N = 5e4 + 10;
int n, q;
int f[N];
int main()
{
cin >> n >> q;
for(int i = 1; i <= n; i++)
{
int x; cin >> x;
f[i] = f[i - 1] + x;
}
while(q--)
{
int t; cin >> t;
int l = 1, r = n;
while(l < r)
{
int mid = (l + r) / 2;
if(f[mid] > t) r = mid;
else l = mid + 1;
}
cout << l << endl;
}
return 0;
}