武大校赛网络预选赛

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\n",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\n",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\n");
            else
            {
                x=toding[x];
                y=toding[y];
                if(mat[x][y]>=inf)puts("-1");
                else printf("%d\n",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\n");
    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----\n",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\n",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

 

posted @ 2014-03-31 13:05  Yours1103  阅读(143)  评论(0编辑  收藏  举报