1.B - Jiubei and Overwatch(注意是范围伤害,只需要找出血量最大值就可以了)
1 #include<bits/stdc++.h>
2 using namespace std;
3 int a[10000];
4 int main()
5 {
6 int m;
7 cin>>m;
8 while(m--)
9 {
10 int n,k,x,y;
11 cin>>n>>k>>x>>y;
12 int sum=0;
13 for(int i=0;i<n;i++)cin>>a[i],sum=max(sum,a[i]);
14 if(sum<=k*x)cout<<(sum-1)/x+1<<endl;
15 else cout<<k+(sum-k*x-1)/y+1<<endl;
16 }
17 return 0;
18 }
2.F - Sum of Numerators(找规律,b每增加一总和从1到a的sum就会减去一次从1到a=a/2的sum)
1 #include<bits/stdc++.h>
2 using namespace std;
3 int a[10000];
4 int main()
5 {
6 int m;
7 cin>>m;
8 while(m--)
9 {
10 long long a,b;
11 cin>>a>>b;
12 long long sum=a*(a+1)/2;
13 while(a>0&&b>0)
14 {
15 a/=2;
16 sum-=a*(a+1)/2;
17 b--;
18 }
19 cout<<sum<<endl;
20 }
21 return 0;
22 }
3.L - Monster Tower(使用优先队列,由于是打一层怪楼就往下掉一层,所以存优先队列找血量最小的怪,叠加血量后pop掉打过的怪,并将能打到的怪存入队列中,如果优先队列中第一个怪都打不过则此答案false)
1 #include<bits/stdc++.h>
2 #define ll long long
3 using namespace std;
4 int a[1000000];
5 int n,k;
6 bool solve(ll x)
7 {
8 priority_queue<ll,vector<ll>,greater<ll>>p;
9 for(int i=0;i<k;i++)
10 p.push(a[i]);
11 ll b=x;
12 for(int i=k;i<n;i++)
13 {
14 ll t=p.top();
15 p.pop();
16 if(b<t)return false;
17 b+=t;
18 p.push(a[i]);
19 }
20 for(int i=k-1;i>=0;i--)
21 {
22 ll t=p.top();
23 p.pop();
24 if(b<t)return false;
25 b+=t;
26 }
27 return true;
28 }
29 signed main() {
30 ios::sync_with_stdio(0);
31 cin.tie(0) , cout.tie(0);
32 int T ;
33 cin >> T ;
34 while(T--)
35 {
36 cin>>n>>k;
37 for(int i=0;i<n;i++)cin>>a[i];
38 ll l=1,r=1e9;
39 ll Mid;
40 while(l<=r)
41 {
42 Mid=l+r>>1;
43 if(solve(Mid))
44 {
45 r=Mid-1;
46 }
47 else l=Mid+1;
48 }
49 cout<<l<<endl;
50 }
51 return 0;
52 }