1 条题解
-
2Nightmare004 LV 7 MOD @ 2018-02-24 02:51:24
这题告诉了我语文不好没法打acm,首先题目说“***她会立即增加一些耐心值,这个值等于上一题消耗的耐心值的一半。***”,我一开始的理解上一题有按顺序1 2 3 4 5,2的上一题是1这样,再后来我以为解决了第二题后,第三题解决不了,解决第四题的时候加的是上一个解决的题目,后来我才知道,***题目其实想说的是解决了第i题 加第i题的耐心值。***也就是说,p=p-a[i]+a[i]/2.0=p-a[i]/2.0
还有,题目说“***她做高数的时候总是喜欢从前往后做***”,题目并没说做完了还可以回头的,因为我做高数从来都是一遍过去就100了,这是这一点体现在案例里
最后一个,题目说“***只要大柱做的只剩下最后一题时***”,我以为是按顺序的做到最后一题了,结果我发现是那种差一题AK(ALL KILL)的时候那种,而且,只剩下一题这个只能翻倍一次。
题目解析完了,没有歧义之后,其实就很容易了,只要开一个数组存值,然后遍历一遍就够了,用一个int型变量index来记录最后一道做不出来的题目,和一个cnt记录A了几题。如果只差一题AK的时候,要翻倍。遍历结束后,如果只差一题AK且不是最后一题,才有讨论的必要,因为,如果AK就不用管了,如果差两题,因为是p-=a[i]/2.0,所以是一直递减的,所以之前如果A不了,现在也A不了,只有差一题AK才有继续A的机会,首先p要翻倍,然后如果能A就-a[i]/2.0,不能就算了。
时间复杂度O(n).
这题其实水的很,数组只要开5就够大了#include<iostream> using namespace std; int main() { int m, cnt, n, index, a[5]; double p; scanf("%d", &m); while (m--) { scanf("%lf%d", &p, &n); for (int i = 0; i < n; ++i)scanf("%d", a + i); index = cnt = 0; for (int i = 0; i < n; ++i) { if (cnt == n - 1)p *= 2; if (p >= a[i]) { p -= a[i] / 2.0; ++cnt; } else index = i; } if (cnt == n - 1 && index != n - 1) { p *= 2; if (p >= a[index]) { p -= a[index] / 2.0; ++cnt; } } cout << cnt << ' ' << p << endl; } return 0; }
- 1
信息
- 难度
- 3
- 分类
- (无)
- 标签
- (无)
- 递交数
- 35
- 已通过
- 7
- 通过率
- 20%
- 上传者