Survivor
Survivor
(https://codeforces.com/group/L9GOcnr1dm/contest/422378/problem/F)
血的教训
比较有意思的一个贪心题
简单翻译一下题目:
输入第一行n,m,k;分别代表有几个人,几分钟,和总共能治疗的次数
输入第二行n个数,代表他们个别的初始血量
第三行n个数,代表每分钟他们会被扣掉的血
第四行,代表如果你用技能可以给这个人加多少血
问你,最后一共能活多少个人
看到题目第一想法就是用每轮加的血量去比较能不能救活,毫无列外t了(没看好k的数据范围,到1e11了
code
while (1){ co++; for (int i = 1; i <= n; i++) { toadd[i]+=ad[i]; if(toadd[i] + hp[i] > 0 && !vis[i]){ k-=co; if(k >= 0){ count++,vis[i] = true; } } } if(co >= k || k == 0){ cout << count << endl; return 0; } }
既然t了那换个思路。首先人得活到m分钟后,也就是说连带加血,你m分钟后的血量一定得大于0。那么就是计算出m分钟后他们所剩的血量,然后用这个血量去除于每次他们每个人能加的血量再加上1,就是他们m分钟后需要治疗多少次就能存活了
这里注意三点,一:有可能他们m分钟后血量还是正的。二:有可能m分钟后他们的血量刚好为0。三:为啥要加1呢,如果他们的剩余的血量刚好可以整除他们每次加的血量,那么治疗后他们的血量刚好是0,依旧是不能活的
Acode
ll count = 0; vector<ll> co(n+1); co[0] = -1; for (int i = 1; i <= n; i++) { if(hp[i] > 0)co[i] = 0; else if(hp[i] == 0)co[i] = 1; else co[i] = abs(hp[i])/ad[i]+1; } sort(co.begin(),co.end(),cmp); for (int i = 1; i <= n; i++) { k -= co[i]; if(k >= 0)count++; else break; } cout << count << endl;
还有一个特别有意思的
wacode
ll count = 0; vector<ll> co(n+1); co[0] = -1; for (int i = 1; i <= n; i++) { if(hp[i] > 0)co[i] = 0; else if(hp[i] == 0)co[i] = 1; else co[i] = abs(hp[i])/ad[i]+1; } sort(co.begin(),co.end(),cmp); for (int i = 1; i <= n; i++) { k -= co[i]; if(k >= 0)count++; else { cout << count << endl; return 0; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理