ural 1917. Titan Ruins: Deadly Accuracy(Titan Ruins系列)
2013-04-20 23:30
134 查看
还是水题一道,直接模拟。代码写的有点乱。这是翻译:http://www.nocow.cn/index.php/Translate:URAL/1917
间限制:1秒
空间限制:64MB
你去一个洞窟内探险,洞窟内有许多宝石,但都有魔法守护,你需要用魔法将它们打下来。
每个宝石都有自己的防御等级,当你的魔法超过它的防御等级时它就会被你打下来。
但是,当它被你打下来的时候,它会反弹你的魔法。如果反弹的魔法过强,你就会被自己的魔法杀死。
很不幸的是,你的魔法是群体性的,你不能选择攻击谁,只要防御等级低于你魔法水平的宝石都会被你打下来。并且每个都会反弹你的魔法。
你可以假设你的魔法水平无限大,但你躲避反弹的魔法的能力却并不是很强。
输入:
第一行两个数,分别是:N,宝石总数。P:你躲避反弹魔法的能力。(只要达到这个数你就会死)
第二行N个数,每个宝石的防御等级。
输出:
一行,两个数,分别是你能打下多少宝石,以及需要释放几次魔法。
样例输入:
5 4
4 1 4 1 2
样例输出:
3 2
样例说明:
第一次用强度为1的魔法打下两个防御等级为1的宝石,反弹魔法为2,可以承受。
第二次用强度为2的魔法打下一个防御等级为2的宝石,反弹魔法为2,可以承受。
剩余2个防御等级为4的宝石,是无法打下来的。(反弹魔法会达到8)
所以答案为3 2.
再附上几组数据:
5 4
2 2 1 1 1
5 2
5 7
4 1 4 1 2
3 1
直接模拟代码:
代码写的有点乱。
间限制:1秒
空间限制:64MB
你去一个洞窟内探险,洞窟内有许多宝石,但都有魔法守护,你需要用魔法将它们打下来。
每个宝石都有自己的防御等级,当你的魔法超过它的防御等级时它就会被你打下来。
但是,当它被你打下来的时候,它会反弹你的魔法。如果反弹的魔法过强,你就会被自己的魔法杀死。
很不幸的是,你的魔法是群体性的,你不能选择攻击谁,只要防御等级低于你魔法水平的宝石都会被你打下来。并且每个都会反弹你的魔法。
你可以假设你的魔法水平无限大,但你躲避反弹的魔法的能力却并不是很强。
输入:
第一行两个数,分别是:N,宝石总数。P:你躲避反弹魔法的能力。(只要达到这个数你就会死)
第二行N个数,每个宝石的防御等级。
输出:
一行,两个数,分别是你能打下多少宝石,以及需要释放几次魔法。
样例输入:
5 4
4 1 4 1 2
样例输出:
3 2
样例说明:
第一次用强度为1的魔法打下两个防御等级为1的宝石,反弹魔法为2,可以承受。
第二次用强度为2的魔法打下一个防御等级为2的宝石,反弹魔法为2,可以承受。
剩余2个防御等级为4的宝石,是无法打下来的。(反弹魔法会达到8)
所以答案为3 2.
再附上几组数据:
5 4
2 2 1 1 1
5 2
5 7
4 1 4 1 2
3 1
直接模拟代码:
#include <iostream> #include <cstdio> #include <cstring> #include <functional> #include <algorithm> using namespace std; int n, p; int count(int *a, int val) //统计大小为val的spell可以打掉多少宝石 { int num = 0; for (int i = 0; i < n; ++i) if (a[i] <= val && a[i] != 0) ++num; return num; } void asign(int *a, int val) //将已经被打掉的置零 { for (int i = 0; i < n; ++i) if (a[i] <= val) a[i] = 0; } int main() { while (scanf("%d %d", &n, &p)!= EOF) { int a ; for (int i = 0; i < n; ++i) scanf("%d", &a[i]); std::sort(a, a + n, greater<int>()); //要求咒语数尽可能小,所以从大到小排序 int sum = 0, magic_num = 0; //sum是打下的宝石数量,magicn是魔法数 int t = -1; //t作为一个标记,当sum数不再增加时,sum==t,模拟结束 while (1) { for (int i = 0; i < n; ++i) { int cnt = count(a, a[i]); if (a[i] != 0 && a[i] * cnt <= p) //小于等于p,不是小于 { sum += cnt; asign(a, a[i]); ++magic_num; } while (a[i] == a[i+1] && i < n) //跳过相同的a[i] ++i; } if (t == sum) //结束标记,t是记录上次的sum用的,上下两次相同模拟结束 break; t = sum; } printf("%d %d\n", sum, magicn); } // system("pause"); return 0; }
代码写的有点乱。
相关文章推荐
- ural 1917. Titan Ruins: Deadly Accuracy(Titan Ruins系列)
- ural 1910. Titan Ruins: Hidden Entrance(Titan Ruins系列题目)
- ural 1910. Titan Ruins: Hidden Entrance(Titan Ruins系列题目)
- 【URAL 1917】Titan Ruins: Deadly Accuracy(DP)
- URAL:1917 Titan Ruins: Deadly Accuracy
- URAL - 1917 Titan Ruins: Deadly Accuracy(水题)
- 《解剖PetShop》系列之一
- 打造自己的专业图像工具-Visual C++ 2005图像编程系列【五】(中)
- ASP.NET 2.0入门与提高系列课程(视频课程讲师:徐栋)
- KOEI无双系列游戏3D资源MOD工具(更新v0.8)
- 《一起学Windows phone7开发》系列视频课程
- JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础
- 敏捷开发日常跟进系列之一:燃尽图(上)
- Unity学习系列笔记1:Asset Import & Creation
- RHEL6入门系列之二十八,init进程与系统运行级别
- 【Linux_Fedora_应用系列】_2_如何安装视频播放器和视频文件解码
- Redis源码分析系列七:initServer下
- c语言数据结构链表源代码----笛风读书笔记系列
- 深入理解java内存模型系列文章
- TRIZ系列-创新原理-8-重量补偿原理