博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[题解]Codeforces Round #519 - B. Lost Array
阅读量:6265 次
发布时间:2019-06-22

本文共 1657 字,大约阅读时间需要 5 分钟。

【题目】

【描述】

Bajtek有一个数组x[0],x[1],...,x[k-1]但被搞丢了,但他知道另一个n+1长的数组a,有a[0]=0,对i=1,2,...,n。由此可以找到数组x[0],x[1],...,x[k-1]的一些可能情况,即满足这个关系的数组x[0],x[1],...,x[k-1]。问一共有多少种可能的数组x[0],x[1],...,x[k-1]的长度k,输出可能的数量以及所有可能的长度k。

数据范围:1<=n<=1000,1<=a[i]<=10^6(这里不包括a[0],默认a[0]=0)

【思路】

 先不考虑数组x是循环的,即不考虑数组x是有限长的,那么由数组a可以反解出与数组a等长的一个数组“x”,我们要找的真正的数组x实际上是这个反解出来的“x”的一个周期,我们要找的就是这个“x”有多少种周期长度。

要验证i是不是“x”的一个周期长度,则将“x”的元素分为i组,即下标模i相同的分到一组,检查每一组从前往后数第某个元素是不是都是相同的。这里复杂度是O(n)的。

对i进行枚举,即可找到所有可能的周期长度。至此复杂度为O(n^2)。

【我的实现】

 复杂度:O(n^2)

1 #include 
2 #include
3 #include
4 #include
5 6 using namespace std; 7 #define MaxN 1020 8 int x[MaxN]; 9 int Ans[MaxN];10 11 int main()12 {13 int n;14 int a, pre_a = 0;15 int i, j, k;16 //int cur;17 bool flag;18 scanf("%d", &n);19 for(i = 1; i <= n; i++)20 {21 scanf("%d", &a);22 x[i-1] = a - pre_a;23 pre_a = a;24 }25 for(i = 1; i <= n; i++) //step = i26 {27 flag = false;28 for(j = 0; j < i; j++) //start at j for each zhouqi29 {30 for(k = j; k < n; k += i)31 {32 if(k > j && x[k] != x[k-i])33 {34 flag = true;35 break;36 }37 }38 if(flag)39 break;40 }41 if(!flag)42 Ans[++Ans[0]] = i;43 }44 printf("%d\n", Ans[0]);45 for(i = 1; i <= Ans[0]; i++)46 printf("%d ", Ans[i]);47 return 0;48 }
View Code

【评测结果】

 

转载于:https://www.cnblogs.com/CQBZOIer-zyy/p/9873846.html

你可能感兴趣的文章
MFC程序显示控制台输出
查看>>
网易博客挂了,转一篇以前的文章过来纪念一下吧。。
查看>>
三角形(css3)
查看>>
Cgroups 与 Systemd
查看>>
java三大框架实现任务调度——IRemindService
查看>>
(Z)MySQL变量的使用
查看>>
浅谈命令查询职责分离(CQRS)模式
查看>>
洛谷P1481 魔族密码(LIS)
查看>>
SQL Server 访问URL 调用WebServer
查看>>
静态代码块在何时调用
查看>>
Kafka控制器选举流程剖析
查看>>
appium封装显示等待Wait类和ExpectedCondition接口
查看>>
Android 全局弹出版本更新 Dialog 思考和解决办法
查看>>
IDEA在当前类中查找方法快捷键--转
查看>>
初识少儿编程
查看>>
浏览器 UA 判断
查看>>
理解OAuth 2.0
查看>>
高并发处理思路与手段(三):消息队列
查看>>
Docker+Nginx部署Angular
查看>>
Docker & ASP.NET Core (4):容器间的连接
查看>>