2017计蒜之道 复赛 BDF

来源:互联网 发布:wow淘宝卖的宏怎么样 编辑:程序博客网 时间:2024/06/10 14:34

一句话题解系列。
B Windows 画图
对每条线段暴力标记。

#include<cstdio>#include<algorithm>using namespace std;int ans[300][300],n,m,q;int gcd(int x,int y){    return y?gcd(y,x%y):x;}int main(){    int x,y,x1,y1,x2,y2,d,dx,dy;    scanf("%d%d",&n,&m);    for (int i=1;i<=n;i++)    {        scanf("%d%d%d%d",&x1,&y1,&x2,&y2);        d=gcd(abs(x1-x2),abs(y1-y2));        dx=(x1-x2)/d;        dy=(y1-y2)/d;        for (;;x2+=dx,y2+=dy)        {            ans[x2][y2]=i;            if (x2==x1) break;        }    }    scanf("%d",&q);    while (q--)    {        scanf("%d%d",&x,&y);        printf("%d\n",ans[x][y]);    }}

D 百度地图导航
把每个城市群也看成点,注意分成入点和出点。

#include<cstdio>#include<algorithm>#include<vector>#include<cstring>#include<queue>using namespace std;const int maxn=60010;#define LL long longqueue<int> q;vector<pair<int,int> > to[maxn];LL dis[maxn];int n,m,in[maxn];int main(){    int x,y,z,w,s,t;    scanf("%d%d",&n,&m);    for (int i=1;i<=m;i++)    {        scanf("%d",&x);        while (x--)        {            scanf("%d",&y);            to[y].push_back(make_pair(i+n,0));            to[i+n+m].push_back(make_pair(y,0));        }    }    scanf("%d",&x);    while (x--)    {        scanf("%d%d%d",&y,&z,&w);        to[y].push_back(make_pair(z,w));        to[z].push_back(make_pair(y,w));    }    scanf("%d",&x);    while (x--)    {        scanf("%d%d%d",&y,&z,&w);        to[y+n].push_back(make_pair(z+n+m,w));        to[z+n].push_back(make_pair(y+n+m,w));    }    scanf("%d%d",&s,&t);    memset(dis,0x3f,sizeof(dis));    dis[s]=0;    in[s]=1;    q.push(s);    while (!q.empty())    {        x=q.front();        q.pop();        for (vector<pair<int,int> >::iterator it=to[x].begin();it!=to[x].end();++it)            if (dis[x]+(*it).second<dis[(*it).first])            {                dis[(*it).first]=dis[x]+(*it).second;                if (!in[(*it).first])                {                    q.push((*it).first);                    in[(*it).first]=1;                }            }        in[x]=0;    }    if (dis[t]<1e12) printf("%lld\n",dis[t]);    else printf("-1\n");}

F 腾讯消消乐
直接暴力状压,O(2nn3)可以过。

#include<cstdio>#include<algorithm>using namespace std;#define LL long longconst int p=1000000007,maxn=20;int a[maxn],dp[300010][maxn],ok[300010],n,m;int gcd(int x,int y){    return y?gcd(y,x%y):x;}int main(){    int d,ans=0,x,y;    scanf("%d%d",&n,&m);    for (int i=0;i<n;i++) scanf("%d",&a[i]);    for (int s=1;s<(1<<n);s++)    {        x=0;        for (int i=0;i<n;i++)            if (s&(1<<i)) x=gcd(x,a[i]);        dp[s][1]=x>=m;    }    for (int s=1;s<(1<<n);s++)        for (int i=2;i<=n;i++)            for (int j=0;j<n;j++)                if (s&(1<<j))                {                    x=y=0;                    for (int k=j;k<n;k++)                        if (s&(1<<k))                        {                            x=gcd(x,a[k]);                            y|=1<<k;                            if (x>=m) dp[s][i]=(dp[s][i]+dp[s^y][i-1])%p;                            else break;                        }                }    for (int i=1;i<=n;i++)        ans=(ans+(LL)dp[(1<<n)-1][i]*i)%p;    //dfs((1<<n)-1,10,n);    printf("%d\n",ans);}
原创粉丝点击