zoukankan      html  css  js  c++  java
  • 武大校赛网络预选赛

    1537:水题,排序贪心

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define maxn 1009
    using namespace std;
    
    int num[maxn];
    int tmp[maxn];
    int b[maxn];
    
    int main()
    {
        int n;
        while(scanf("%d",&n)&&n)
        {
            for(int i=1;i<=n;i++)
                scanf("%d%d",&num[i],&b[i]);
            int ret=0,ans;
            for(int i=0;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    tmp[j]=num[j]-i*b[j];
                }
                ans=0;
                sort(tmp+1,tmp+n+1);
                for(int j=n;j>n-i;j--)
                    ans+=tmp[j];
                ret=max(ret,ans);
            }
            printf("%d
    ",ret);
        }
        return 0;
    }
    View Code

    1538:贪心+dp

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define maxn 1009
    using namespace std;
    
    struct node
    {
        int a,b;
        bool operator<(const node &t)const
        {
            if(b==t.b)return a>t.a;
            return b>t.b;
        }
    }num[maxn];
    
    int f[maxn][maxn];
    
    int main()
    {
        int n;
        while(scanf("%d",&n)&&n)
        {
            for(int i=1;i<=n;i++)
                scanf("%d%d",&num[i].a,&num[i].b);
            sort(num+1,num+n+1);
            memset(f,0,sizeof f);
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=i;j++)
                {
                    f[i][j]=max(f[i-1][j-1]+num[i].a-(j-1)*num[i].b,f[i-1][j]);
                }
            }
            int ans=0;
            for(int i=1;i<=n;i++)
                ans=max(ans,f[n][i]);
            printf("%d
    ",ans);
        }
        return 0;
    }
    View Code

    1540:

    #include <iostream>
    #include<stdio.h>
    #include <cstring>
    #define ll long long
    #define mod 1000000007
    using namespace std;
    
    struct Mat
    {
        ll mat[2][2];
    } N,E;
    
    Mat operator*(Mat a,Mat b)
    {
        Mat c;
        memset(c.mat,0,sizeof c.mat);
        for (int i=0; i<2; i++)
            for (int j=0; j<2; j++)
                for (int k=0; k<2; k++)
                {
                    if (a.mat[i][k] && b.mat[k][j])
                    {
                        c.mat[i][j]+=(a.mat[i][k]*b.mat[k][j])%mod;
                        c.mat[i][j]%=mod;
                    }
                }
        return c;
    }
    
    Mat operator^(Mat a,ll x)
    {
        Mat c=E;
        for (; x; x>>=1)
        {
            if (x&1)
                c=c*a;
            a=a*a;
        }
        return c;
    }
    void init()
    {
        N.mat[0][0]=N.mat[0][1]=1;
        N.mat[1][0]=1;
        N.mat[1][1]=0;
        memset(E.mat,0,sizeof E.mat);
        E.mat[0][0]=E.mat[1][1]=1;
    }
    
    ll extenclid(ll d,ll f)
    {
        ll x1,x2,x3,y1,y2,y3,t1,t2,t3,k;
        if(d>f) d=d+f-(d=f);
        x1=1,x2=0,x3=f;
        y1=0,y2=1,y3=d;
        while(1)
        {
            if(y3==0) return 0;
            if(y3==1) return y2;
            k=x3/y3;
            t1=(x1-k*y1+2*mod)%(2*mod), t2=(x2-k*y2+2*mod)%(2*mod), t3=(x3-k*y3+2*mod)%(2*mod);
            x1=y1,x2=y2,x3=y3;
            y1=t1,y2=t2,y3=t3;
        }
    }
    
    int main()
    {
        ll n;
        while(scanf("%I64d",&n)&&n)
        {
            init();
            n--;
            ll ret=0;
            Mat ans=N^n;
            ll tmp1=ans.mat[0][1];
            ll tmp2=ans.mat[0][0];
            ll tmp3=(tmp1+tmp2)%mod;
            if(n%2)tmp1=-tmp1;
            ret=(((tmp3*tmp3)%mod)*tmp2+tmp1+1+mod)%mod;
            ll x=extenclid(2,mod);
            ret=ret*x%mod;
            cout<<ret<<endl;
        }
        return 0;
    }
    View Code

    1542:并查集+floyd

    #include<cstdio>
    #include<cstring>
    #define maxn 100009
    #define inf 1<<30
    using namespace std;
    struct egde
    {
        int f,to;
        int value;
    } eg[maxn];
    
    int f[maxn];
    
    int find(int x)
    {
        return x==f[x]?x:f[x]=find(f[x]);
    }
    
    void un(int x,int y)
    {
        int a=find(x);
        int b=find(y);
        if(a!=b)
        {
            f[a]=b;
        }
    }
    
    int mat[205][205];
    int ding[maxn];
    int toding[maxn];
    
    void floyd(int num)
    {
        for(int k=0; k<num; k++)
        {
            for(int i=0; i<num; i++)
            {
                for(int j=0; j<num; j++)
                {
                    if(i==j)continue;
                    if(mat[i][k]>=inf||mat[k][j]>=inf)continue;
                    if(mat[i][j]>=inf||(mat[i][j]>mat[i][k]+mat[k][j]))
                    {
                        mat[i][j]=mat[i][k]+mat[k][j];
                    }
                }
            }
        }
    }
    
    
    int main()
    {
        int n,m;
        int x,y,v;
        while(scanf("%d",&n)&&n)
        {
            memset(toding,0,sizeof toding);
            for(int i=0; i<204; i++)
                for(int j=0; j<204; j++)
                {
                    //if (i==j) mat[i][j]=0;
                    mat[i][j]=inf;
                }
            scanf("%d",&m);
            for(int i=1; i<=n; i++)f[i]=i;
            for(int i=0; i<m; i++)
            {
                scanf("%d%d%d",&x,&y,&v);
                eg[i].f=x;
                eg[i].to=y;
                eg[i].value=v;
                if(v==0)
                    un(x,y);
            }
            int cnt=0;
            for(int i=1; i<=n; i++)
                if(f[i]==i)
                {
                    ding[cnt]=i;
                    toding[i]=cnt++;
                }
            for(int i=0; i<m; i++)
            {
                x=find(eg[i].f);
                y=find(eg[i].to);
                if(x==y)
                    continue;
                x=toding[x];
                y=toding[y];
                if(mat[x][y]>eg[i].value)
                {
                    mat[x][y]=mat[y][x]=eg[i].value;
                }
            }
    
            floyd(cnt);
    //        for(int i=0;i<cnt;i++)
    //        {
    //            for(int j=0;j<cnt;j++)
    //                printf("%d ",mat[i][j]);
    //            puts("");
    //        }
            int q;
            scanf("%d",&q);
            while(q--)
            {
                scanf("%d%d",&x,&y);
                x=find(x);
                y=find(y);
                if(x==y)printf("0
    ");
                else
                {
                    x=toding[x];
                    y=toding[y];
                    if(mat[x][y]>=inf)puts("-1");
                    else printf("%d
    ",mat[x][y]);
                }
            }
        }
        return 0;
    }
    /*
    6 7
    1 2 5
    1 3 0
    1 4 10
    4 5 2
    3 4 3
    5 6 1
    4 6 8
    9
    1 4
    1 5
    4 6
    */
    View Code

    1545:直接手推

    #include <iostream>
    #include<stdio.h>
    using namespace std;
    
    int main()
    {
        printf("13
    ");
        return 0;
    }
    View Code

     1546:bfs+状态压缩dp

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    #define inf 1<<30
    #define maxn 1<<12
    using namespace std;
    
    int dp[maxn][14];
    int ff[maxn][14];
    int w,h,l,m,n;
    char s[55][55];
    int dis[13][13];
    int num[13];
    bool vis[55][55];
    
    struct node
    {
        int x,y;
        int d;
        node(int x,int y,int d):x(x),y(y),d(d) {}
    };
    
    queue<node>q;
    
    void bfs(int x,int y)
    {
        int in=s[x][y]-'a';
        while(!q.empty())q.pop();
        node u=node(x,y,0);
        vis[x][y]=1;
        q.push(u);
        while(!q.empty())
        {
            u=q.front();
            if(s[u.x][u.y]>='a'&&s[u.x][u.y]<='z')
                dis[in][s[u.x][u.y]-'a']=u.d;
            node v(0,0,0);
            q.pop();
            if(u.x+1<h&&!vis[u.x+1][u.y]&&s[u.x+1][u.y]!='#')
            {
                vis[u.x+1][u.y]=1;
                v=node(u.x+1,u.y,u.d+1);
                q.push(v);
            }
            if(u.x-1>=0&&!vis[u.x-1][u.y]&&s[u.x-1][u.y]!='#')
            {
                vis[u.x-1][u.y]=1;
                v=node(u.x-1,u.y,u.d+1);
                q.push(v);
            }
            if(u.y+1<w&&!vis[u.x][u.y+1]&&s[u.x][u.y+1]!='#')
            {
                vis[u.x][u.y+1]=1;
                v=node(u.x,u.y+1,u.d+1);
                q.push(v);
            }
            if(u.y-1>=0&&!vis[u.x][u.y-1]&&s[u.x][u.y-1]!='#')
            {
                vis[u.x][u.y-1]=1;
                v=node(u.x,u.y-1,u.d+1);
                q.push(v);
            }
        }
    }
    
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d%d%d%d",&w,&h,&l,&m,&n);
            for(int i=1; i<=m; i++)
                scanf("%d",&num[i]);
            for(int i=0;i<m+2;i++)
                {
                    for(int j=0;j<m+2;j++)
                        dis[i][j]=inf;
                }
            int cnt=1;
            for(int i=0; i<h; i++)
            {
                scanf("%s",s[i]);
                for(int j=0; j<w; j++)
                {
                    if(s[i][j]=='@')
                        s[i][j]=(cnt++)+'a';
                    else if(s[i][j]=='$')
                        s[i][j]='a';
                    else if(s[i][j]=='<')
                        s[i][j]=(m+1)+'a';
                }
            }
            for(int i=0; i<h; i++)
            {
                for(int j=0; j<w; j++)
                {
                    if(s[i][j]>='a'&&s[i][j]<='z')
                    {
                        memset(vis,0,sizeof vis);
                        bfs(i,j);
    //                    printf("%d----
    ",s[i][j]-'a');
                    }
                }
            }
    //        for(int i=0;i<=m+1;i++)
    //        {
    //            for(int j=0;j<=m+1;j++)
    //            {
    //                printf("%d ",dis[i][j]);
    //            }
    //            puts("");
    //        }
            int ret=0;
            for(int i=1; i<=m; i++)
                if(dis[0][i]<=l/2)
                {
                    ret+=num[i];
                    num[i]=0;
                }
            int ans=0;
            memset(dp,-1,sizeof dp);
            memset(ff,0,sizeof ff);
            for(int i=0; i<m; i++)
            {
                ff[1<<i][i+1]=dis[0][i+1];
                if(dis[0][i+1]<=(l-dis[i+1][m+1]))
                {
                    dp[1<<i][i+1]=num[i+1];
                    ans=max(ans,num[i+1]);
                }
            }
    //        for(int i=1; i<(1<<m); i++)
    //        {
    //            for(int j=1; j<=m; j++)
    //                printf("%d ",dp[i][j]);
    //            puts("");
    //        }
            for(int i=1; i<(1<<m); i++)
            {
                for(int j=1; j<=m; j++)
                {
                    int td=dis[j][m+1];
                    if((i&(1<<(j-1)))==0)
                        continue;
                    int tmp=i-(1<<(j-1));
                    if(tmp==0)continue;
                    for(int k=1; k<=m; k++)
                    {
                        if(dp[tmp][k]==-1)continue;
                        if((tmp&(1<<(k-1)))==0)continue;
                        if(ff[tmp][k]+dis[k][j]<=(l-td))
                        {
                            if(dp[i][j]==-1)
                            {
                                dp[i][j]=dp[tmp][k]+num[j];
                                ff[i][j]=ff[tmp][k]+dis[k][j];
                            }
                            else if(dp[i][j]>dp[tmp][k]+num[j])
                            {
                                dp[i][j]=dp[tmp][k]+num[j];
                                ff[i][j]=ff[tmp][k]+dis[k][j];
                            }
                        }
                    }
                    ans=max(dp[i][j],ans);
                }
            }
    //        printf("%d %d
    ",ans,ret);
            if(ans+ret<n||dis[0][m+1]>l)
                puts("NO");
            else puts("YES");
        }
        return 0;
    }
    /*
    3
    8 7 6 6 1000
    100 200 300 400 200 200
    ####@###
    ........
    ........
    ...$...@
    @@......
    <@@.....
    ########
    */
    View Code
  • 相关阅读:
    js获取url参数方法
    JQuery ajax 传递数组
    删除数组中的重复元素
    jquery load的使用
    css3 圆角
    一个项目最忌讳什么
    Lambda 表达式笔记
    KE ASP.NET取到kindeditor 编辑器数据
    ADO.NET
    .NET中Bind和Eval的区别
  • 原文地址:https://www.cnblogs.com/yours1103/p/3635493.html
Copyright © 2011-2022 走看看