本文共 1308 字,大约阅读时间需要 4 分钟。
题中给定了一个正数序列,但这里我有两个疑惑点:
这里为什么这么算呢?我们观察题目,每个数出现在什么地方呢?以它为首的子序列和以在它之前的数为首且包括它在内的子序列中。我们以0.3为例,首先以0.3为首的子序列有(0.3) (0.3, 0.4),这个的数量计算方式很简单:n-i,也就是上图里提到的ai;以在0.3之前的数为首且包括0.3在内的子序列有 (0.1, 0.2, 0.3) (0.1, 0.2, 0.3, 0.4) (0.2, 0.3) (0.2, 0.3, 0.4),而这个的计算方式为:ak-(i-k),k=0,1...i-1(我们可以用一个循环来实现)
原先想在得到每一个值之后再算出现次数和总和,后来想想其实可以直接在输入的时候就把ai算出来,后面的数在输入的时候可以直接用ak,用动态数组实现是再好不过的了(好吧最后也没有用动态数组,因为发现不需要用到数据,直接初始化就OK了),感觉有点动态规划的意思了。 (哦豁!后来发现这个循环被嵌套在大循环里,运行超时了...) 于是我又发现了这个出现次数是对称的,如果我只求一半的话,运行会不会不超时呢? 好吧,还是会超时。 刚刚去看了看其他的解,我的问题是出在了二重循环上,那如果把二重循环化为一重,就一定能解决,而它的出现次数其实就是:#include#include using namespace std;int main(){ int n; cin>>n; double ans=0; for(int i=0;i >data; ans+=data*(i+1)*(n-i); cout< <<" "<<(n*i-i*i+n-i)<
转载地址:http://ddhh.baihongyu.com/