1 条题解

  • 2
    @ 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;
    }
    
    • @ 2018-02-24 17:12:33

      让大佬失望了

  • 1

信息

难度
3
分类
(无)
标签
(无)
递交数
35
已通过
7
通过率
20%
上传者