2019中南大学研究生招生夏令营机试题(DFS 最短路 马拉车 贪心 进制转换)

A

思路:

直接DFS将能走的全部砖块染色即可。

代码:

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define LL long long
#define INF 0x3f3f3f3f3f
using namespace std;
int dx[10]= {-1,1,0,0};
int dy[10]= {0,0,-1,1};
const int maxn=100+10;
int w,h;
char a[maxn][maxn];
bool vis[maxn][maxn];
int maxx;
int ty[maxn][maxn];
void dfs(int x,int y,int step)
{
    //cout<<x<<"---"<<y<<endl;
    for(int i=0; i<4; i++)
    {
        if(x+dx[i]<=0||y+dy[i]<=0||x+dx[i]>h||y+dy[i]>w)
            continue;
        if(vis[x+dx[i]][y+dy[i]])
            continue;
        if(a[x+dx[i]][y+dy[i]]=='#')
            continue;
        vis[x+dx[i]][y+dy[i]]=1;
        dfs(x+dx[i],y+dy[i],step+1);
    }
    return ;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen("in.txt","r",stdin);
#endif
    while(cin>>w>>h&&w&&h)
    {
        memset(vis,0,sizeof(vis));
        maxx=0;
        int x1,y1;
        rep(i,1,h)
        {
            rep(j,1,w)
            {
                cin>>a[i][j];
                if(a[i][j]=='@')
                {
                    x1=i;
                    y1=j;
                }
            }
        }
        vis[x1][y1]=1;
        dfs(x1,y1,0);
        rep(i,1,h)
        {
            rep(j,1,w)
            {
                if(vis[i][j])
                    maxx+=1;
            }
        }
        cout<<(maxx)<<endl;
    }
}
 
/**************************************************************
    Problem: 1110
    User: 20171789
    Language: C++
    Result: 正确
    Time:0 ms
    Memory:1780 kb
****************************************************************/

B

思路:

求乘积最长路即可。

代码:

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define LL long long
#define INF 0x3f3f3f3f3f
using namespace std;
int dx[10]= {-1,1,0,0};
int dy[10]= {0,0,-1,1};
const int maxn=3000+10;
int n,m;
struct node
{
    int to;
    double cost;
};
int bx,by;
vector<node>v[maxn];
bool vis[maxn];
double dis[maxn];
priority_queue<pair<int,double>,vector<pair<int,double>>,less<pair<int,double>> >q;
void solve()
{
    rep(i,0,n+1)dis[i]=0,vis[i]=0;
    while(q.size())
        q.pop();
    dis[bx]=1.0;
    q.push(make_pair(bx,1.0));
    while(q.size())
    {
        int now=q.top().first;
        q.pop();
//        if(vis[now])
//            continue;
//        vis[now]=1;
        for(int i=0; i<(int)v[now].size(); i++)
        {
            int to=v[now][i].to;
            double co=v[now][i].cost;
            if(dis[to]<dis[now]*co)
            {
                dis[to]=dis[now]*co;
                //cout<<dis[to]<<"--"<<endl;
                q.push(make_pair(to,dis[to]));
            }
        }
    }
}
int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen("in.txt","r",stdin);
#endif
    while(cin>>n>>m)
    {
        rep(i,1,m)
        {
            int a,b,c;
            cin>>a>>b>>c;
            double c1=1-c*1.0/100;
            //cout<<c1<<endl;
            v[a].push_back(node{b,c1});
            v[b].push_back(node{a,c1});
        }
        cin>>bx>>by;
        solve();
        //cout<<dis[by]<<endl;
        printf("%.8lf\n",100.0/dis[by]);
        rep(i,1,n)
        {
            if(v[i].size())
                v[i].clear();
        }
    }
}
 
/**************************************************************
    Problem: 1111
    User: 20171789
    Language: C++
    Result: 正确
    Time:48 ms
    Memory:2720 kb
****************************************************************/

C

思路:

马拉车算法

代码:

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define LL long long
#define INF 0x3f3f3f3f3f
using namespace std;
int dx[10]= {-1,1,0,0};
int dy[10]= {0,0,-1,1};
const int maxn=20000+10;
char ch[maxn];
char now[maxn<<1];
int n;
int hw[maxn<<1];
void init()
{
    now[0]='!',now[1]='#';
    for(int i=0; i<n; i++)
    {
        now[2*i+2]=ch[i];
        now[2*i+3]='#';
    }
    now[2*n+2]='$';
    n=2*n+1;
}
void manacher()
{
    int maxright,mid;
    maxright=0;
    for(int i=1; i<=n; i++)
    {
        //cout<<i<<endl;
        if(i>maxright)
        {
            hw[i]=1;
        }
        else
        {
            hw[i]=min(hw[mid*2-i],maxright-i);
        }
        while(now[i-hw[i]]==now[i+hw[i]])
            hw[i]++;
        if(maxright<i+hw[i])
        {
            mid=i;
            maxright=i+hw[i];
        }
    }
}
int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen("in.txt","r",stdin);
#endif
    while(cin>>ch)
    {
        int ans=0;
        memset(hw,0,sizeof(hw));
        n=strlen(ch);
        init();
        manacher();
        for(int i=0; i<=n; i++)
        {
            ans+=hw[i]/2;
        }
        cout<<ans<<endl;
    }
}

D

思路:

直接排序。

代码:

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define LL long long
#define INF 0x3f3f3f3f3f
using namespace std;
int dx[10]= {-1,1,0,0};
int dy[10]= {0,0,-1,1};
const int maxn=100+10;
int a[maxn],b[maxn];
int main()
{
    #ifdef ONLINE_JUDGE
#else
    freopen("in.txt","r",stdin);
#endif
    int n,m;
    while(cin>>n)
    {
        rep(i,1,n)cin>>a[i];
        cin>>m;
        rep(i,1,m)cin>>a[n+i];
        sort(a+1,a+n+m+1);
        rep(i,1,n+m)cout<<a[i]<<" ";
        cout<<endl;
    }
}
 
/**************************************************************
    Problem: 1113
    User: 20171789
    Language: C++
    Result: 正确
    Time:0 ms
    Memory:1712 kb
****************************************************************/

E

思路:

先将每一个十六进制数转化成4位的2进制,然后3个3个的转化成八进制即可。

代码:

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
#define LL long long
#define INF 0x3f3f3f3f3f
using namespace std;
int dx[10]= {-1,1,0,0};
int dy[10]= {0,0,-1,1};
const int maxn=400000+10;
char a[maxn];
int b[maxn];
int c[5];
int ans[maxn];
int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen("in.txt","r",stdin);
#endif
    while(cin>>a)
    {
        int flag=0;
        int cnt=0;
        int len=strlen(a);
        rep(i,0,len-1)
        {
            char ch=a[i];
            int tmpx=0;
            if(ch>='A')
                tmpx=ch-'A'+10;
            else
                tmpx=ch-'0';
            int k=0;
            memset(c,0,sizeof(c));
            rep(j,1,4)
            {
                if(tmpx)
                {
                    c[j]=tmpx%2;
                    tmpx/=2;
                }
            }
            dep(j,4,1)
            b[++cnt]=c[j];
        }
        //得到二进制序列
        //rep(i,1,cnt)cout<<b[i];
        //cout<<endl;
        int ss=0;
        for(int i=cnt; i>=1; i-=3)
        {
            int x=b[i]+b[i-1]*2+b[i-2]*4;
            ans[++ss]=x;
        }
        int f=1;
        rep(i,1,ss)
        {
            //cout<<ans[i]<<"--";
            if(ans[i])
                flag=1;
        }
        //cout<<flag<<endl;
        if(!flag)
        {
            cout<<0<<endl;
            continue;
        }
        while(!ans[ss])
            ss--;
        dep(i,ss,1)
        {
            cout<<ans[i];
        }
        cout<<endl;
    }
}
 
/**************************************************************
    Problem: 1114
    User: 20171789
    Language: C++
    Result: 正确
    Time:8 ms
    Memory:5224 kb
****************************************************************/
发布了1062 篇原创文章 · 获赞 72 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/lanshan1111/article/details/105298932