求助,WA了最后一个点,TLE了第二个
查看原帖
求助,WA了最后一个点,TLE了第二个
428449
Amon_Xolotl楼主2023/9/18 17:28
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=103,M=600005;
int n,m,a[N],s[M],cnt;
int h[M<<1],e[M<<1],ne[M<<1],w[M<<1],tot,d[M],base=2e9;
bool flag=false;
void add(int x,int y,int z)
{
  e[++tot]=y,ne[tot]=h[x],h[x]=tot,w[tot]=z;
}
struct zjy
{
  int dis,id;
  bool operator < (const zjy &t) const{
  return dis>t.dis;
  }
};
bool vis[M];
queue<int> q;
void dijstra()
{
  q.push(0);
  vis[0]=1;
  while(!q.empty())
  {
    int u=q.front();
    q.pop();
    vis[u]=false;
    for(int i=h[u];i;i=ne[i])
    {
      int v=e[i];
      if(d[v]>d[u]+w[i])
      {
        d[v]=d[u]+w[i];
        if(!vis[v])
        {
          q.push(v);
          vis[v]=true;
        }
        
      }
    }
  }
}
signed main()
{
  scanf("%lld%lld",&n,&m);
  for(int i=1;i<=n;++i)
  {
    scanf("%lld",&a[i]);
    if(a[i]<=m+1)
    {
      flag=true;
    }
    else
    {
      s[++cnt]=a[i];
      base=min(base,s[cnt]);
      for(int j=1;j<=m;++j)
      {
        s[++cnt]=a[i]-j;
        base=min(base,s[cnt]);
      }
    }
  }
  if(flag)
  {
    cout<<"-1";
    return 0;
  }
  memset(d,0x3f3f3f3f,sizeof(d));
  for(int i=0;i<base;++i)
  {
    for(int j=1;j<=cnt;++j)
    {
      add(i,(i+s[j])%base,s[j]);
    }
  }
  d[0]=0;
  int ans=0;
  dijstra();
  for(int i=1;i<base;++i)
  {
    ans=max(ans,d[i]);
  }
  if(ans==0x3f3f3f3f)
  {
    cout<<"-1";
  }
  else
  {
    cout<<ans-base;
  }
  return 0;
}
2023/9/18 17:28
加载中...