D. Zero Remainder Array1400 / 思维 规律
Posted 幽殇默
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了D. Zero Remainder Array1400 / 思维 规律相关的知识,希望对你有一定的参考价值。
https://codeforces.com/problemset/problem/1374/D
模拟做法: TLE了。
大致思路用一个小根堆来存储。
- 如果堆内为空,说明直接就是合法的直接输出0
- 否则直接模拟,例如k=5,当2有两个时,第一个2是可以直接加的,但是第二个2就不可以了,我们得走一轮即2+k==2+5以此类推。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
typedef long long int LL;
LL a[N],n,m,t;
int main(void)
{
scanf("%lld",&t);
while(t--)
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
priority_queue<LL,vector<LL>,greater<LL>>heap;
for(int i=1;i<=n;i++)
{
int temp=(m-a[i]%m);
if(temp!=m) heap.push( temp );
}
LL last=0;
if(!heap.size())
{
cout<<0<<endl;
continue;
}
while(heap.size())
{
auto a=heap.top(); heap.pop();
if(a<=last) heap.push(a+m);
last=max(last,a);
}
cout<<last+1<<endl;
}
return 0;
}
优化的代码用map来看该数有没有出现过,没出现过直接赋值,出现过的话直接加一轮。
注意随时的维护最大的信息
#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
typedef unsigned long long int LL;
LL a[N],n,m,t;
int main(void)
{
cin>>t;
while(t--)
{
cin>>n>>m;
map<LL,LL>mp;
LL ans=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
LL temp=a[i]%m;
if(!temp) continue;//直接可以整除
temp=m-temp;
if(mp.count(temp)==0)//不存在
{
mp[temp]=temp;
ans=max(ans,temp);
}
else//存在了
{
mp[temp]=mp[temp]+m;//直接加一轮
ans=max(ans,mp[temp]);
}
}
if(ans) cout<<ans+1<<endl;
else cout<<ans<<endl;
}
return 0;
}
以上是关于D. Zero Remainder Array1400 / 思维 规律的主要内容,如果未能解决你的问题,请参考以下文章