top1编程
← 返回题目
题解

购买快乐水

1 条题解

  • 0
    @ 2026-8-5 12:14:09

    解题思路

    要去考 NOIP 啦,小童要给 n 位同学买快乐水。规则是:

    • 每个人至少买 1 瓶;
    • 如果这位同学坐学校大巴(t=1)而且愿意打狼(q=1),就可以多拿 1 瓶。

    所以每个人买几瓶,可以由一个函数 func(t, q) 来计算:

    1. 先记下每个人都先有 1 瓶;
    2. 如果 t1 且 q1,就再加 1 瓶;
    3. 返回这个人需要的瓶数。

    主程序把 n 个人需要的瓶数全部加起来,就是答案。

    打个比方:老师发小贴纸,每个人都先发1张;只有"既坐大巴又愿意打狼"的"幸运儿"能多拿1张。数一数总共发出去多少张就行啦!

    参考代码

    // P4607 购买快乐水:每个人买1瓶,坐大巴且愿意打狼的人多买1瓶
    #include <iostream>
    using namespace std;
    
    // func函数:计算一个人购买快乐水的数量
    int func(int t, int q) {
        int x = 1;              // 每个人都先买1瓶
        if (t == 1 && q == 1) x++;  // 坐大巴(t=1)且愿意打狼(q=1),多1瓶
        return x;
    }
    
    int main() {
        int n, t, q, sum = 0;
        cin >> n;
        for (int i = 0; i < n; i++) {
            cin >> t >> q;
            sum += func(t, q);  // 把每个人的瓶数累加起来
        }
        cout << sum << endl;
        return 0;
    }
    

    复杂度分析

    • 我们对 n 位同学每人处理一次,每次只做常数次判断,所以时间复杂度是 O(n)。
    • 我们只用了几个变量,空间复杂度是 O(1)。

    n 最大只有 20,程序瞬间就能算出答案。

    • 1