2015年中南大学研究生复试机试题(1010~1014)

目录:

A:好坑的电子地图
B:容易的题
C:数字
D:防水堤坝
E:奇怪的餐厅

A:好坑的电子地图

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

思路:
单源最短路径。因为从奇数结点和偶数结点出发会花费不同的时间,所以可以看成一个有向图。然后dijkstra就可以了。n=1000,不会超时的。
AC代码:

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

int n,m,s,t,limit;
int mp[MAX][MAX],dis[MAX],vis[MAX];

void dijkstra(){
    memset(vis,0,sizeof(vis));
    memset(dis,INF,sizeof(dis));
    dis[s]=0;
    for(int i=0;i<n;i++){
        int u=-1,minl=INF;
        for(int j=1;j<=n;j++){
            if(dis[j]<minl&&vis[j]==0){
                u=j;
                minl=dis[j];
            }
        }
        if(u==-1) break;
        vis[u]=1;
        for(int v=1;v<=n;v++){
            if(mp[u][v]!=INF&&vis[v]==0){
                if(dis[v]>dis[u]+mp[u][v]){
                    dis[v]=dis[u]+mp[u][v];
                }
            }
        }
    }
}

int main(){
    while(scanf("%d %d %d %d %d",&n,&m,&s,&t,&limit)!=EOF){
        for(int i=0;i<MAX;i++){
            for(int j=0;j<MAX;j++){
                mp[i][j]=INF;
            }
        }

        int a,b,len;
        for(int i=0;i<m;i++){
            scanf("%d %d %d",&a,&b,&len);
            if(a%2==0) mp[a][b]=len+2;
            else mp[a][b]=len+1;
            if(b%2==0) mp[b][a]=len+2;
            else mp[b][a]=len+1;
        }
        dijkstra();
        if(dis[t]>limit) printf("KENG\n");
        else printf("YES %d\n",dis[t]);
    }
    return 0;
}

B:容易的题

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

思路:
简单的字符串问题
AC代码:

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

string s;

int main(){
    while(cin>>s){
        int len=s.length();
        int cnt=0;
        for(int i=0;i<len;i++){
            if(cnt==0&&s[i]=='E'){
                cnt++;
            }
            if(cnt==1&&s[i]=='A'){
                cnt++;
            }
            if(cnt==2&&s[i]=='S'){
                cnt++;
            }
            if(cnt==3&&s[i]=='Y'){
                cnt++;
            }
        }
        if(cnt==4) cout<<"easy"<<endl;
        else cout<<"difficult"<<endl;
    }
    return 0;
}

C:数字

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

思路:
白给题目。
AC代码:

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

string s;
int a[MAX];

int main(){
    while(cin>>s){
        memset(a,0,sizeof(a));
        int len=s.length();
        for(int i=0;i<len;i++){
            a[s[i]-'0']++;
        }
        int num,maxl=-1;
        for(int i=0;i<=9;i++){
            if(a[i]>maxl){
                maxl=a[i];
                num=i;
            }
        }
        cout<<num<<endl;

    }
    return 0;
}

D:防水堤坝

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

思路:
不太好找规律。。。
可以参考:
https://blog.csdn.net/Gong_Yihang/article/details/104986207

E:奇怪的餐厅

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

思路:
贪心。按照折扣由高到低排序,依次选择直到付完为止。
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 n;
double t;

struct node{
    double z,h;
    bool operator < (const node &a) const{
        return z<a.z;
    }
}p[MAX];

int main(){
    while(scanf("%d %lf",&n,&t)!=EOF){
        for(int i=0;i<n;i++){
            scanf("%lf %lf",&p[i].z,&p[i].h);
        }
        sort(p,p+n);
        double cost=0.0,tot=0.0;
        bool flag=false;
        for(int i=0;i<n;i++){
            if(tot+p[i].h>=t){
                cost+=(t-tot)*p[i].z;
                flag=true;
                break;
            }
            tot+=p[i].h;
            cost+=p[i].h*p[i].z;
        }
        if(flag==false) cost+=t-tot;
        ll res=(ll)cost;
        printf("%lld\n",res);
    }
    return 0;
}

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