题目:
勇者 ccj 发现了一片草药丛,排列成一行。ccj 发现这些草药都是有毒的。其中有 n 株草药,编号为 1…n。草药 i 有 pi 的毒力。
在此之前 ccj 法力值提升了许多,习得了一种以毒攻毒的法术。具体地说,对于每一对 1≤i≤j≤n 的 (i,j),ccj 会对从草药 i 到草药 j 之间的所有草药 (包括 i 和 j)释放一次法术。
每次释放法术后——如果有草药的毒力 等于 区间 (i,j) 内所有草药的毒力之和的平均值。勇者就可以从中提取出一株复活草。
问 ccj 最多可以获得多少株复活草?
输入格式
输入的第一行包含 n。第二行包含 n 个空格分隔的整数 p1…pn(1≤pi≤3000)。
输出格式
输出 ccj 最多可以获得的复活草数量。
样例组
输入#1复制
4 1 1 2 3输出#1复制
6提示说明
对仅包含一株草药释放法术均会被计入答案(在这个样例中有 4 株,因为一株草药毒力的平均值等于它本身)在这个样例中 (i,j) 为 (1,2) 和 (2,4) 存在草药的毒力等于区间内所有草药的毒力之和的平均值,最终可以获得 6 株复活草。
测试点性质:
- 测试点 1-5 满足 n≤100。
- 测试点 6-10 满足 n≤3000。
代码:
#include<iostream>
using namespace std;
int a[3010];
int main(){
int n,ans=0;
double sum,avg;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n;i++){
sum=a[i];
int t[3010]={};
t[a[i]]++;
for(int j=i+1;j<n;j++){
sum+=a[j];
t[a[j]]++;
avg=sum/(j-i+1);
if(avg==int (avg)&&t[int (avg)]>0){
ans++;
}
}
}
cout<<ans+n;
return 0;
}
思路:
题意:n个毒草种可以提取多少个复活草n个毒草是不可以交换位置的
从i-j以间 如果有值是i-j区间和的平均值 那么i-j区闻可以得到一个复活草
思路:
1.模拟题目 使用枚举方法 0(N^3)50分 得到所有i-j区间 并一一检査是否能提取出复活草,并统计数量
2.模拟优化 对于i-j区间 依然需要枚举但是对i-i区间求和 做了累加优化
平均值的检查做了桶排序优化进行检查以上两个均为0(1)所以得到 0(N^2)100分