我真的好菜啊,第二题对着空气调试,一度对自己的智商产生了怀疑
想着涨分,结果妥妥的大跌。
B
我他妈的都想到了是精度的问题,可是就差一个变量没有改成ll类型
emmmmm
C
题解
就是运用lower_bound的操作
注意有下面的几种情况:
- 只有所有的人都死了,才会浪费魔法
- 魔法恰好等于攻击的人的总的能力
- 部分的攻击了最后的一个人,因此要记录一下最后一个人的剩余HP
AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| #include <bits/stdc++.h> using namespace std; const int maxn = 2e5+10; typedef long long ll; ll a[maxn]; ll sum[maxn]; ll k[maxn]; int n, q; int main(){ cin>>n>>q; memset(sum, 0, sizeof(sum)); for(int i=0; i<n; i++) { cin>>a[i]; } sum[0] = 0; sum[1] = a[0]; for(int i=2; i<=n; i++){ sum[i] = sum[i-1]+a[i-1]; } int kill = 0; int res = 0; for(int i=0; i<q; i++){ cin>>k[i]; int temp1; if(res>0) temp1 = a[kill] - res; else temp1 = 0; int index = lower_bound(sum+1, sum+n+1, k[i]+sum[kill]+temp1)-(sum); if(index>n){ printf("%d\n", n); res = kill = 0; continue; } if(sum[index] > k[i]+sum[kill]+temp1){ res = sum[index]-k[i]-sum[kill]-temp1; index = index-1; } if(sum[index] == k[i]+sum[kill]+temp1&&index == n){ printf("%d\n", n); res = 0; kill = 0; continue; } if(sum[index] == k[i]+sum[kill]+temp1){ printf("%d\n", n-index); res = 0; kill = index; continue; } else{ int ans = n-index; kill = index; printf("%d\n", ans); } } return 0; }
|
未解决的问题