USACO历年青铜组真题解析 | 2020年12月Daisy Chains

学习C++从娃娃抓起!记录下USACO(美国信息学奥赛)备考青铜组别比赛学习过程中的题目,记录每一个瞬间。

附上汇总贴:USACO历年青铜组真题解析 | 汇总-CSDN博客


【题目描述】

每天,作为她绕农场行走的一部分,奶牛 Bessie 会经过她最喜爱的草地,其中种有 N 朵花(五颜六色的雏菊),编号为 1…N(1≤N≤100),排列成一行。花 i 有 pi 朵花瓣(1≤pi≤1000)。

作为一名崭露头角的摄影家,Bessie 决定给这些花拍些照片。具体地说,对于每一对满足 1≤i≤j≤N 的花 (i,j),Bessie 会给从花 i 到花 j 之间的所有花(包括 i 和 j)拍一张照。

后来 Bessie 查看这些照片时注意到有些照片里存在「平均」的花——一朵恰好有 P 朵花瓣的花,其中 P 等于照片中所有花的花瓣数量的平均值。

Bessie 的照片中有几张存在平均的花?

【输入】

输入的第一行包含 N。第二行包含 N 个空格分隔的整数 p1…pN。

【输出】

输出存在平均的花的照片数量。

【输入样例】

4
1 1 2 3

【输出样例】

6

【代码详解】

#include <bits/stdc++.h>
using namespace std;
int n, a[105], ans=0;
int main()
{
    cin >> n;  // 输入n
    for (int i=1; i<=n; i++) {  // 遍历n朵花
        cin >> a[i];  // 记录每朵花的花瓣数量
    }
    for (int i=1; i<=n; i++) {  // 从1开始遍历
        int avg=0, sum=0;  // 每次初始化花瓣平均数和总数为0
        for (int j=i; j<=n; j++) {  // j从i开始向后遍历
            sum += a[j];  // 计算花瓣总数
            if (sum % (j-i+1)!=0) continue;  // 如果平均数不为整数直接跳过(花的花瓣数不可能是小数)
            avg = sum / (j-i+1);  // 计算平均花瓣数
            for (int k=i; k<=j; k++) {  // 从i遍历到j
                if (a[k]==avg) {  // 如果有任一朵花恰好有p朵花瓣的花
                    ans += 1;  // 照片数自增1
                    break;  // 无需判断该照片中的其他花,直接结束循环
                }
            }
        }
    }
    cout << ans << endl;  // 打印结果
    return 0;
}

【运行结果】

4
1 1 2 3
6

猜你喜欢

转载自blog.csdn.net/guolianggsta/article/details/134840506
今日推荐