2018年 中南大学研究生复试机试题(1025~ 1028)

目录:

A:最短距离
B:a + b问题
C:逃离迷宫
D:可乐

A:最短距离

http://39.106.164.46/problem.php?id=1025

思路:
设小王的坐标为(x1 + u1 * t , y1 + v1 * t)
设小明的坐标为(x2 + u2 * t , y2 + v2 * t)
根据两点间距离公式,可以得到一个关于t的二次函数
然后分情况讨论系数即可。

AC代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX 1000005
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
 
int x1,x2,y11,y2,u1,u2,v1,v2;
 
int main(){
    int t;
    scanf("%d",&t);
    int id=1;
    while(t--){
        scanf("%d %d %d %d",&x1,&y11,&x2,&y2);
        scanf("%d %d %d %d",&u1,&v1,&u2,&v2);
        double a=x2-x1,b=u2-u1,c=y2-y11,d=v2-v1;
        double aa=b*b+d*d,bb=2*(a*b+c*d),cc=a*a+c*c;
        double ans=0.0;
        if(aa==0){
            if(bb>=0) ans=sqrt(cc);
            else ans=0;
        }else{
            if(bb<0) ans=sqrt((4*aa*cc-bb*bb)/(4*aa));
            else ans=sqrt(cc);
        }
        printf("Case %d: %.6lf\n",id++,ans);
    }
    return 0;
}

B:a + b问题

http://39.106.164.46/problem.php?id=1026

思路:
使用map,注意读入即可。
AC代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX 1000005
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;

string s;
map<string,int> mp;

int main(){
    mp["zero"]=0,mp["one"]=1,mp["two"]=2,mp["three"]=3;
    mp["four"]=4,mp["five"]=5,mp["six"]=6,mp["seven"]=7,
    mp["eight"]=8,mp["nine"]=9;
    int a=0,b=0;
    int num=1;
    while(cin>>s){
        if(s!="+"&&s!="="){
            if(num==1) a=a*10+mp[s];
            else b=b*10+mp[s];
        }
        if(s=="+"){
            num=2;
        }
        if(s=="="){
            if(a==0&&b==0) break;
            else{
                printf("%d\n",a+b);
            }
            num=1;
            a=0,b=0;
        }
    }
    return 0;
}

C:逃离迷宫

http://39.106.164.46/problem.php?id=1027

思路:
dfs搜索,不过要求转弯次数不能超过k,适当剪枝即可。
AC代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX 105
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;

int t,m,n,x1,y11,x2,y2,k,visit[MAX][MAX];
char mp[MAX][MAX];
bool flag=false;
int dir[4][2]={{0,-1},{0,1},{-1,0},{1,0}}; //下、上、左、右

bool judge(int x,int y){
    if(x<1||x>m||y<1||y>n) return false;
    return true;
}

void dfs(int x,int y,int num,int face){
    visit[x][y]=1;
    if(num>k||flag==true) return;
    if(x==x2&&y==y2){
        flag=true;
        return;
    }
    for(int i=0;i<4;i++){
        int xx=x+dir[i][0],yy=y+dir[i][1];
        if(judge(xx,yy)&&visit[xx][yy]==0&&mp[xx][yy]!='*'){
            if(face!=i&&face!=4) num++;
            dfs(xx,yy,num,i);
            if(face!=i&&face!=4) num--;//回溯
            visit[xx][yy]=0;
        }
    }
}

int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d %d",&m,&n);
        for(int i=1;i<=m;i++){
            scanf("%s",mp[i]+1);
        }
        scanf("%d %d %d %d %d",&k,&y11,&x1,&y2,&x2);
        if(mp[x1][y11]=='*'||mp[x2][y2]=='*'){
            printf("no\n");
            continue;
        }
        flag=false;
        memset(visit,0,sizeof(visit));
        dfs(x1,y11,0,4);
        if(flag) printf("yes\n");
        else printf("no\n");
    }
    return 0;
}

D:可乐

http://39.106.164.46/problem.php?id=1028

思路:
贪心。尽量用单价最小的买,但是需要注意的是可能会出现用单价最低的买不能凑整的情况,但是用单价低的多买一瓶有可能会比用单价高的其他体积的凑整便宜,所以每次都需要进行比较,和多买一瓶进行比较。
AC代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX 35
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;

int n;
ll l;

struct node{
    int v,p;
    double per;
    bool operator < (const node &x) const{
        return per<x.per;
    }
}a[MAX];

int main(){
    while(scanf("%d %lld",&n,&l)!=EOF){
        for(int i=0;i<n;i++){
            scanf("%d",&a[i].p);
            a[i].v=(int)pow(2,i);
            a[i].per=(double)a[i].p/a[i].v;
        }
        sort(a,a+n);
        ll sum=0,minl=0;
        int id=0;
        while(l>0){
            int v=a[id].v, p=a[id].p; //可乐的体积和单价
            sum+=(l/v)*p;
            if(id==0){
                minl=(l/v+1)*p; //多买一瓶
            }
            if(l%v==0){ //恰好可以买完
                minl=min(minl,sum);
                break;
            }
            if(sum+p<minl){
                minl=sum+p;
            }
            l=l%v;
            id++;
        }
        printf("%lld\n",minl);
    }
    return 0;
}

你可能感兴趣的:(机试)