OCAC暑期比赛第二场 B题 日常浇花 题解

日常浇花
原题链接:http://codeforces.com/problemset/problem/149/A
【题目描述】
2018年12月31号晚,当聪聪的父母给阳台上的花浇完水之后,这对夫妻准备去南极看极光,并且在2020年1月1号的早上再回家。
他们留下了聪聪一个人在家,并且给聪聪布置了一项任务:浇花!
聪聪知道,在第i个月,如果它坚持给花每天早上、中午、晚上各浇一次水,那么在月底的时候这朵花就会长高ai厘米;
如果在第i个月,聪聪没有坚持做到这一点的话(比如哪天早上睡过头了),月底的时候这朵花就不会长高。
聪聪知道,如果在爸妈回来的时候,花长高的高度小于 k 厘米,它的爸妈就会发现他没有好好浇花。
请问聪聪最少需要浇几个月的花,使得花增长的高度能够大于等于 k 厘米(也就是说:爸妈回来之后发现花长高了至少k厘米)。
【输入格式】
输入的第一行包含一个整数k(0<=k<=100)。
输入的第二行包含12个整数,两个正数之间以一个空格分隔,其中第i个整数用于表示ai(1<=ai<=100)。
【输出格式】
输出包含一个整数,用于表示聪聪最少需要浇花的月数。
如果聪聪无论怎样都无法让花增长至少 k 厘米,输出 -1。
【样例输入1】
5
1 1 1 1 2 2 3 2 2 1 1 1
【样例输出1】
2
【样例输入2】
0
0 0 0 0 0 0 0 1 1 2 3 0
【样例输出2】
0
【样例输入3】
11
1 1 4 1 1 5 1 1 4 1 1 1
【样例输出3】
3
【题目分析】
本题涉及算法:贪心。
我们只需要设一个变量tot,tot初始等于0,
然后对数组 a 从大到小进行排序,然后依次将数组 a 中的值加入到 tot ,知道 tot >= k。
如果 k == 0,那么聪聪就不需要浇花,直接输出0;
如果遍历结束的时候 tot 还是小于 k,那么输出-1。
实现代码如下:

#include <bits/stdc++.h>
using namespace std;

int k, tot, a[12];
inline bool cmp(int a, int b) { return a > b; }

int main() {
    cin >> k;
    for (int i = 0; i < 12; i ++) cin >> a[i];
    sort(a, a+12, cmp);
    if (k == 0) {
        cout << 0 << endl;
        return 0;
    }
    for (int i = 0; i < 12; i ++) {
        tot += a[i];
        if (tot >= k) {
            cout << i + 1 << endl;
            return 0;
        }
    }
    cout << -1 << endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/ocac/p/11130963.html
今日推荐