HDU4648 Magic Pen 6 签到

来源:互联网 发布:还原软件 编辑:程序博客网 时间:2024/06/05 02:31

题目链接:HDU4648

题目大意:给你n个数和一个模m,要求去掉连续的几个数后,这n个数的对m取模不变,求最多能去掉的个数。

AC代码:


/*2017年8月2日20:11:25HDU4648 签到 AC*/ #include<stdio.h>#include<string.h>#include<algorithm>using namespace std;typedef long long ll;const int maxn=1e5+10;ll f[maxn],pre[maxn];ll n,m,res,x;int main(){while(~scanf("%I64d%I64d",&n,&m)){memset(f,0,sizeof(f));memset(pre,0,sizeof(pre));res=0;for(ll i=1;i<=n;i++){scanf("%I64d",&x);f[i]=f[i-1]+x;///pre[f[i]%m]=i;while(f[i]<0) f[i]+=m;if(!pre[f[i]%m]){if(f[i]%m) pre[f[i]%m]=i;else if(i>res) res=i;//判断0的情况,如果出现零的情况,直接记录下标 } /*出现同余情况,那么中间值的和一定是m的倍数*/ else if(i-pre[f[i]%m]>res){res=i-pre[f[i]%m];}}printf("%I64d\n",res);}return 0;}

下面贴一下集训队大神代码,跑的更快。

#include<iostream>#include<stdio.h>#include<algorithm>using namespace std;const int maxn=1e5+10;int a[maxn];int pre[maxn];int n,m;int main(){cin.sync_with_stdio(0);while(cin>>n>>m){for(int i=1;i<=n;i++) cin>>a[i];for(int i=0;i<m;i++) pre[i]=0;int sum=0,ans=0; for(int i=1;i<=n;i++){sum=((sum+a[i])%m+m)%m;if(sum==0) ans=i;if(pre[sum]) ans=max(ans,i-pre[sum]);else pre[sum]=i;}cout<<ans<<endl;} return 0;} 


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 无法买机票出行怎么办 机票的保险发票怎么办 行李办理托运后怎么办 飞机托运超尺寸怎么办 机票无托运行李怎么办 飞机票不含托运怎么办 登机重量超了怎么办 随身行李超重了怎么办 国际航班没带护照怎么办 派出所不开户籍怎么办 做火车没身份证怎么办 2018年怎么办户籍证明 一岁宝宝护照怎么办 户籍证明开不了怎么办 信用卡提不了额怎么办 信用卡提额诈骗怎么办 信用卡提额失败怎么办 身份证证件号错误怎么办 东西落在飞机上怎么办 乘高铁忘记带身份证怎么办 身份证丢坐火车怎么办 苏州市民a卡怎么办 集体户口户口页怎么办 网上不能买火车票怎么办 集体户口离婚时怎么办 没户口本怎么办结婚证 酒店没带身份证怎么办 住酒店拍身份证怎么办 手机取火车票要怎么办 香港酒店没登记怎么办 住宿未带身份证怎么办 长期住酒店怎么办暂住证 港澳通行过期了怎么办 异地社保卡怎么办出来 住酒店换洗衣服怎么办 住酒店车被划了怎么办 住酒店身份证丢失怎么办 没有社保卡医院怎么办 宾馆未带身份证怎么办 医保住院未登记怎么办 住酒店房卡丢了怎么办