Codeforces 1296D - Fight with Monsters

题目大意:

n 只怪兽,每只的血量为 h[i] ,你的攻击力为 a ,你的对手攻击力为 b

打每只怪兽时,都是你先出手,然后你的对手出手,这样轮流攻击

如果是你给予了怪兽最后一击,你就能得到一分

你还有 k 次机会能让你的对手暂停行动一回合

问你最多能拿到多少分

解题思路:

记你加上你的对手两个人各攻击一次造成的伤害为 s=a+b

贪心可得,如果想节省那 k 次机会,应该和对手一起把怪兽耗到只剩一点血,即能在最后一回合杀死的情况时

即怪兽减去的血量为 s 的倍数,表示经过了这么多回合后,怪兽的血量降到了 s 以内,能够决定是你或者你的对手给予的最后一击了

对于血量的计算,可以用 h=(h-1)%s+1 来降低到 1~s 的范围内

然后判断这个 h ,如果h属于1~a,说明肯定是你击败这只怪兽,直接点数加一,考虑下一只

但如果是在 a+1~s 这个区间,说明如果你不使用那 k 次机会的话,会由对手给予最后一击

而如果要使用这些机会,则需要使用【 (h-a)/a 向上取整】次机会才行

贪心易得,需要把这些机会从小到大排序,然后先把机会用在需要次数少的怪兽上

全部处理完后输出答案即可

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 void solve(){
 5     vector<ll> v;
 6     ll n,a,b,k,s,h,d,i,len,ans=0;
 7     cin>>n>>a>>b>>k;
 8     s=a+b;
 9     while(n--){
10         cin>>h;
11         d=(h-1)%s+1;
12         if(d<=a)
13             ans++;
14         else
15             v.push_back(d-a);
16     }
17     sort(v.begin(),v.end());
18     len=v.size();
19     for(i=0;i<len;i++){
20         d=(v[i]+a-1)/a;//向上取整
21         if(k>=d){
22             k-=d;
23             ans++;
24         }
25     }
26     cout<<ans<<‘\n‘;
27 }
28 int main(){
29     ios::sync_with_stdio(0);
30     cin.tie(0);cout.tie(0);
31     solve();
32
33     return 0;
34 }

原文地址:https://www.cnblogs.com/stelayuri/p/12262327.html

时间: 2024-11-06 19:19:25

Codeforces 1296D - Fight with Monsters的相关文章

Codeforces - 102222H - Fight Against Monsters - 贪心

https://codeforc.es/gym/102222/problem/H 题意:有一堆怪兽,怪兽有HP和ATK.你有一个英雄,英雄每次先被所有怪兽打,然后打其中一个怪兽.打的伤害递增,第一次1,第二次2,以此类推. 为什么感觉是贪心呢?证明一波. 首先开始打一个怪兽肯定一直打到死为止.那么打死他要求的次数可以二分出来(其实暴力也可以).两只怪兽交换打的顺序会不会变好? 先打第一只怪兽: \(num_1*sumatk+num_2*(sumatk-atk_1)\) 先打第二只怪兽: \(nu

Codeforces #617 (Div. 3) D. Fight with Monsters(贪心,排序)

There are nn monsters standing in a row numbered from 11 to nn . The ii -th monster has hihi health points (hp). You have your attack power equal to aa hp and your opponent has his attack power equal to bb hp. You and your opponent are fighting these

Codeforces Round #617 (Div. 3) D. Fight with Monsters

题意:打怪,拿分,不同就是可以让别人跳过打怪哪一个环节,不过只有k次 题解:算出每个怪消耗的k,排序 ,贪心 原文地址:https://www.cnblogs.com/RE-TLE/p/12288935.html

CodeForces - 954D Fight Against Traffic

Fight Against Traffic Little town Nsk consists of n junctions connected by m bidirectional roads. Each road connects two distinct junctions and no two roads connect the same pair of junctions. It is possible to get from any junction to any other junc

2018 ACM-ICPC 宁夏 H.Fight Against Monsters(贪心)

It is my great honour to introduce myself to you here. My name is Aloysius Benjy Cobweb Dartagnan Egbert Felix Gaspar Humbert Ignatius Jayden Kasper Leroy Maximilian. As a storyteller, today I decide to tell you and others a story about the hero Huri

CODEFORCES #526 F. Pudding Monsters

题目描述: 给出一个 N * N 的矩阵,每一行.每一列,有且仅有一个特殊点.问有多少个K * K的矩阵内恰好有K个特殊点. 解题思路: 转换下模型,矩阵可以看成一个N的排列,求的是有多少连续子序列中的数是一个区间中连续的,也就是最大数减最小数等于长度减一.那么我们就可以考虑分治解决,对于跨过分治点m的情况的,可以分两大类考虑,最值各在分治点一侧.同在分治点一侧.第一种,可以直接枚举一侧长度,就能计算出另一侧长度,在判断是否合法.第二种,假如i在左,j在右,一种情况是max[j] - min[i

CodeForces 487A Fight the Monster

1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 int judge(int hy,int ay,int dy,int hm,int am,int dm)//计算特定的攻击与防御之下,需要加多少hp 5 { 6 if(am <= dy) 7 return 0; 8 int d1 = am - dy; 9 //cout<<" d1 = "<<d1<&

Codeforces 1334C - Circle of Monsters(差值取前缀和 / 贪心)

两种思路其实只差在写法上 看不懂的就直接看代码吧qwq 题面 题意 n只怪物围成一圈,每只怪物拥有体力a和爆炸伤害b 如果怪物 i 死亡(体力小于等于0),则与他相邻的下一只怪物将受到 b[i] 点伤害 (如果 i<n ,则下一只怪物为 i+1 :如果 i==n,则下一只怪物为 1) 如果相邻的下一只怪物不存在,则什么也不会发生 如果相邻的下一只怪物受到伤害后也死亡了,那么再下一只怪物会继续受到伤害(链式反应) 每次你能随便挑一只怪物开一枪,那只怪物的体力将会降低 1 点 问至少需要开多少枪才能

Codeforces Round #617 (Div. 3) 补题记录

1296A - Array with Odd Sum 题意:可以改变数组中的一个数的值成另外一个数组中的数,问能不能使数组的和是个奇数 思路:签到,如果本来数组的和就是个奇数,那就OK 如果不是,就需要把数组中其中一个奇(偶)数改成偶(奇)数,相当于加一减一 所以测一下这个数组如果有个奇数并且还有个偶数就行 #include <cstdio> #include <iostream> #include <map> #include <set> #include