给出一个A数组,A = 【0,2,5,8】,n = 3,N = 10,r = 2;
在样例中可以看出在【0,2),【2,5),【5,8),【8,10)这些区间内,我们处在其中任何一个区间中时,f(i)就是已知的,并且相同。
我们假设一个函数absGfSum(a1, a2, f)表示在【a1,a2)区间内,已知f(i),求g(i)
我们知道在【a1,a2)中,f(i) 是不变的,而g(i)是单调递增的。
所以
1、 当g(a1) >= f 时,表示所有的g(i)都大于等于f(i),直接算出在【a1,a2)中abs( f(i)的总和 - g(i) 的总和);
2、当g(a2) <= f 时,表示所有的g(i)都小于等于f(i),也可以直接算出在【a1,a2)中abs( f(i)的总和 - g(i) 的总和);
3、当以上两个条件不满足时,说明前半段g(i) < f(i) 后半段g(i) >= f(i),那么只要算出中间 g(i) = f(i) 时的位置就行了,假设中间这个位置表示为mid,那么【a1,mid)就是第2种情况,【mid,a2) 就是第一种情况。
综上所述,我们还有两个问题需要解决。
第一个问题:计算【a1,a2)区间内,g(i) 的总和。
我们只需实现一个g(i)前n项和的函数gn,然后gn(a2 - 1)- gn(a1 - 1)即可。
当r = 2时,g(i)是0,0,1,1,2,2,3,3……
当r = 3时,g(i)是0,0,0,1,1,1,2,2,2,3,3,3……
以r = 2为例,将第一项和第二项,第三项和第四项依此类推,相加之后,就形成了一个等差数列。
等差数列an = (首项 + 尾项) * 项数 / 2;
编号:0,1,2,3,4,5,6,7,8……n
g(i) :0,0,1,1,2,2,3,3,4……n / r
相加后:0,2,4,6,8……
通过观察可以发现:g(i) = i / r;
(1)当(i + 1) / r == 0时,说明前 i 项 正好构成 像(0,0,1,1)这样整齐的数列
这时,首项为0, 尾项为 i / r * r (i / r 是g(i),相加后的尾项是 r 个g(i)),
项数为(i + 1)/ r,
(2)当(i + 1)/ r != 0时,我们先算出前i项中 像(0,0,1,1)这样整齐的数列,再加上多出的几项即可。
这时,首项为0,尾项为(i / r - 1) * r,项数为(i + 1) / r,还剩下(n + 1) % r项,所以最后加上(n + 1)% r * (n / r);
第二个问题:找到【a1, a2)区间内f(i) == g(i) 时的位置mid
直接遍历

long long mid = a1;
for(; mid <= a2; mid++){if(mid / r == f){break;}
}

以上就是这道题的解题思路。
需要注意的是数据类型使用long long
下面是我的代码

#include <bits/stdc++.h>
using namespace std;
//计算g(i) 的前n项和
long long gn(long long n, long long r){if(n < 0) return 0;if((n + 1) % r != 0){long long m = (n + 1) % r;return (n / r * r - r) * ((n + 1) / r) / 2 + m * (n / r);}return n / r * r * ((n + 1) / r) / 2;
}
//计算在a1~a2范围内,当f(i)>g(i)时,f(i) - g(i)求和,当f(i)<=g(i)时,g(i) - f(i)求和
long long absGfSum(long long a1, long long a2, long long f, long long r){if(a1 / r >= f || a2 / r <= f){return abs((a2 - a1) * f - (gn(a2 - 1, r) - gn(a1 - 1, r)));}long long mid = a1;for(; mid <= a2; mid++){if(mid / r == f){break;}}return (mid - a1) * f - (gn(mid - 1, r) - gn(a1 - 1, r))+ gn(a2 - 1, r) - gn(mid - 1, r) - (a2 - mid) * f;
}int main(){long long n, N;cin >> n >> N;long long r = N / (n + 1);//记录数组中的前后两个数,数组中第一个数默认是0,所以a1作为数组中的第一个数,输入的数作为a2,long long a1 = 0, a2 = 0;long long sum = 0;for(int j = 0; j < n; j++){cin >> a2;//j就是[a1, a2)范围内的f(i)的值sum += absGfSum(a1, a2, j, r);;a1 = a2;}a2 = N;sum += absGfSum(a1, a2, n, r);cout << sum << endl;return 0;
}

CCF - 202112-2 - 序列查询新解相关推荐

  1. CSP CCF: 202112-2 序列查询新解 (C++)

    题目链接:计算机软件能力认证考试系统 试题编号: 202112-2 试题名称: 序列查询新解 时间限制: 1.0s 内存限制: 512.0MB 题目背景 上一题"序列查询"中说道: ...

  2. CCF CSP 202112-2 序列查询新解

    单纯地讲思路有些难懂,这里结合一个实际例子来说明: 我们假设A = {0,1,3},n = 2,N = 10,r = 10 / (2 + 1) = 3. i 0 1 2 3 4 5 6 7 8 9 f ...

  3. CCF 202112-2 序列查询新解 python 满分

    CCF 202112-2 序列查询新解 python 满分 题目叙述 问题描述:略 输入格式:略 输出格式:略 样例 满分证明 解题思路 01Python超时70分 02满分python思路 第一,计 ...

  4. CCF CSP202112-2 序列查询新解

    CCF CSP202112-2 序列查询新解 题目背景 上一题"序列查询"中说道: A=[A0,A1,A2,⋯,An]A=[A_0,A_1,A_2,⋯,A_n]A=[A0​,A1​ ...

  5. CCF CSP 序列查询新解

    CCF CSP 序列查询新解(C语言) 题目背景 上一题"序列查询"中说道: A=[A0,A1,A2,⋯,An] 是一个由 n+1 个 [0,N) 范围内整数组成的序列,满足 0= ...

  6. ~5 ccf 2021-12-2 序列查询新解

    序列查询新解 题目描述 输入 输出 样例输入 样例输出 子任务 源代码 关于这题 题目描述 输入 输出 样例输入 样例1 3 10 2 5 8 样例2 9 10 1 2 3 4 5 6 7 8 9 样 ...

  7. CCF-CSP-202112-2:序列查询新解(C++11题解)

    文章目录 问题描述 解题思路 AC代码 问题描述 题目来源:CCF-CSP-202112-2:序列查询新解 解题思路 思路稍后再补. AC代码 PA了一次,是因为没开long long #includ ...

  8. CCF-CSP 202112-2 序列查询新解

    题目:序列查询新解 思路:在f区间内划分g区间,注意g区间左端点的定值,不断移动g区间(长度都为r),当g区间末端点超出f的范围,进入下一个f循环 #include<bits/stdc++.h& ...

  9. csp202112-2:序列查询新解 题解

    题目 样例 思路: 前缀和思想 观察f(x)f(x)f(x)和g(x)g(x)g(x)的序列,其实是有规律的: f(x)f(x)f(x)在每个A[i]A[i]A[i]处+1+1+1,在[A[i],A[ ...

最新文章

  1. git commit之后,想撤销commit
  2. android呼吸灯动画,Android高德地图自定义定位蓝点实现呼吸灯功能
  3. mysql --创建数据库
  4. OpenCV Stitching_detailed 详解
  5. 快速入门Pytorch(1)--安装、张量以及梯度
  6. [机器学习-Sklearn]函数sklearn.feature_extraction.DictVectorizer理解与总结
  7. 干得漂亮!签约“这辈子不可能打工”男子的经纪公司将被拉黑
  8. NET USE 命令用法
  9. logback日志pattern_Logback 配置文件这么写,TPS提高10倍
  10. python批量读取landsat8的波段
  11. 调试经验——使用Matlab绘制f(x)=sin(x)/x的函数图形
  12. Infor LN咨询服务市场报告-行业发展机遇、市场定位及主要驱动因素
  13. 2019.10.8 \t\n艾希练习
  14. matlab 删除workspace,MATLAB命令中清空workspace的是
  15. 在华为云服务器安装libreoffice软件
  16. 如何扩展计算机c盘的控件,如何无损扩展C盘空间大小,这一招足够!
  17. php无限极分类整理
  18. 线性稳压电源和开关电源到底有什么区别
  19. 简单的制作一个钓鱼网页!
  20. 计算机net是什么意思翻译,net是什么意思_net的翻译_音标_读音_用法_例句_爱词霸在线词典...

热门文章

  1. superuser root 原理详细分析
  2. 联想小新air14plus酷睿版和锐龙版哪个好
  3. Compile IceE under Android NDK
  4. 计算机组织与结构【9 高速缓冲存储器(Cache)】
  5. 2023三月六级英语作文模板
  6. mysql基础 Task03:复杂一点的查询
  7. 旱地粮油作物如何防灾减灾
  8. linux-kernel编译过程——mips平台示例
  9. Spring Security(02)认证配置
  10. linux 下安装ATI 显卡驱动