学习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