选拔六
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 }