hdu 4648 Magic Pen 6 多校的一个题目
来源:互联网 发布:网络用语2016 编辑:程序博客网 时间:2024/06/01 07:18
题目是说给你N个数再给一个MOD 这N个数的和对MOD取模的值是K问你可以从这N个数中最多删除多少个连续的数使得剩下的数的和模上MOD的结果不变还是K
这题数据范围有点大,不过有O(N)的算法就可以搞定了。
方法 题意转化一下就是: 给出一列数a[1]...a[n],求长度最长的一段连续的数,使得这些数的和能被M整除。 分析:设这列数前i项和为s[i],则一段连续的数的和 a[i]+a[i+1]+...+a[j-1]+a[j]=s[j]-s[i-1],所以这段连续的数的和能被m整除的条件就是 (s[j]-s[i-1]) % m == 0,即 s[j]%m-s[i-1]%m == 0,因此,只需要每一个余数找使s[i]%m等于该余数的最小的i,和s[j]%m等于该余数的最大的j,相减即为最长的连续的数的长度。
代码就比较简单了,只要记录最先出现的不同和得下标就可以很快做出来的,代码精简了sum数组和原数据的数组,可能会有点难懂。。其中v数组的应用是关键,挺好的,这个方法
#include<stdio.h>#include<string.h>inline int max(int a,int b) {return a>b? a:b;}int N,M,a,v[10005],ans,sum,i,pre;//pre是用来记录sum[i-1]的而sum记录的是sum[i]// v数组的v[i]记录的是第一次出现前缀和为i时其对应的下标,若没出现过就是-1int main(){ while(~scanf("%d%d",&N,&M)) { memset(v,-1,sizeof(v)); pre=v[0]=sum=ans=0; for(i=1;i<=N;++i) { scanf("%d",&a); sum=(pre+a)%M; sum=(sum+M)%M;//因为有负数,取模的时候要注意一下的 if(v[sum]==-1) v[sum]=i; ans=max(ans,i-v[pre=sum]); } printf("%d\n",ans); } return 0;}
- hdu 4648 Magic Pen 6 多校的一个题目
- 2013 多校第五场 hdu 4648 Magic Pen 6
- hdu 4648 Magic Pen 6
- HDU 4648 Magic Pen 6
- hdu - 4648 - Magic Pen 6
- hdu 4648 Magic Pen 6
- HDU 4648 Magic Pen 6
- HDU 4648 Magic Pen 6
- hdu 4648Magic Pen 6
- HDU 4648 Magic Pen 6
- HDOJ 题目4648 Magic Pen 6(水题)
- hdu 4648 Magic Pen
- HDU 4648 magic pen
- hdu 4648 - Magic Pen 6(“水”题)
- hdu 4648 Magic Pen 6(贪心)
- 【HDU- 4648】 Magic Pen 6 【思维 】
- hdoj 4648 Magic Pen 6
- hdu 4649 Magic Pen 6 解题报告
- ext js4 关于如何获取grid修改后的数据的问题
- VA01创建SO的增强点MV45AFZZ的几点实际应用总结
- 导入导出大全
- vb数据库中Data控件的运用解析
- hdu4644 BWT
- hdu 4648 Magic Pen 6 多校的一个题目
- 唱吧4.0.5体验
- C++ 的一些免费库
- Hibernate之Session线程本地化
- java程序员面试宝典(2)
- iOS6兼容性问题的整理
- Js性能优化
- hdu 2196 树形DP
- 患抑郁被炒 女孩告就业歧视索赔7.4万