codeforces 510D Fox And Jumping

来源:互联网 发布:看异性洗澡知乎 编辑:程序博客网 时间:2024/05/24 03:04

之前一篇写了题意

这里讲另外一种做法。  

大概是用 map 记录 所有的公约数状态 然后暴力更新



代码如下 很好懂

思想很简单 ,对于CF用这种写法还是可以。就是复杂度不太好计算

但是比我用dp  状压质因子 跑的时间少      这种写法 只跑了 124MS  而状压 质因子DP  却跑了468MS


代码如下


#include<iostream>#include<algorithm>#include<stdio.h>#include<string.h>#include<map>using namespace std;#define INFF 0x3fffffffmap<int,int>dp;int l[310],c[310];int gcd(int x,int y){    if(y==0)        return x;    return gcd(y,x%y);}int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        dp.clear();        int p=0;        for(int i=1;i<=n;i++)        {            scanf("%d",&l[i]);            p=gcd(l[i],p);        }        for(int i=1;i<=n;i++)            scanf("%d",&c[i]);        if(p!=1)        {            printf("-1\n");            continue;        }        for(int i=1;i<=n;i++)        {            if(dp.find(l[i])==dp.end())                dp[l[i]]=c[i];            else                dp[l[i]]=min(dp[l[i]],c[i]);        }        int ans=INFF;        for(int i=1;i<=n;i++)        {            map<int,int>::iterator it;            for(it=dp.begin();it!=dp.end();it++)            {                int tmp=gcd(l[i],it->first);                int cost=it->second;                if(dp.find(tmp)==dp.end())                {                    dp[tmp]=cost+c[i];                }                else                {                    if(dp[tmp]>cost+c[i])                        dp[tmp]=cost+c[i];                }                if(tmp==1)                    ans=min(ans,dp[1]);            }        }        printf("%d\n",ans);    }    return 0;}

 

0 0
原创粉丝点击