勇者CCJ-草药

题目:

勇者 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分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值