2014年中南大学研究生复试机试题(1005~1009)

目录:

A:成绩转换
B:平方和与立方和
C:破译密码
D:最大连续子序列
E:安全路径

A:最大连续子序列

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

思路:
白给题目。
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;

int main(){
     
    while(cin>>n){
     
        if(n>=108&&n<=120){
     
            cout<<"A"<<endl;
        }else if(n>=100&&n<=107){
     
            cout<<"B"<<endl;
        }else if(n>=80&&n<=99){
     
            cout<<"C"<<endl;
        }else if(n>=72&&n<=79){
     
            cout<<"D"<<endl;
        }else if(n>=0&&n<=71){
     
            cout<<"E"<<endl;
        }else{
     
            cout<<"Score is error!"<<endl;
        }
    }
    return 0;
}

B:平方和与立方和

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

思路:
注意进行强制转换,否则会溢出。
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;

int main(){
     
    while(cin>>n>>m){
     
        if(n>m){
     
            int tmp=n;
            n=m;
            m=tmp;
        }
        ll sum1=0,sum2=0;
        for(int i=n;i<=m;i++){
     
            if(i%2==0) sum1+=(ll)i*i; //要进行强制转换!
            else sum2+=(ll)i*i*i;
        }
        cout<<sum1<<" "<<sum2<<endl;
    }
    return 0;
}

C:破译密码

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

思路:
简单字符串处理。
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,res;

int main(){
     
    while(getline(cin,s)){
     
        if(s=="ENDOFINPUT") break;
        if(s!="START"&&s!="END"){
     
            res="";
            for(int i=0;i<s.length();i++){
     
                if(s[i]>='A'&&s[i]<='Z'){
     
                    if(s[i]>='A'&&s[i]<='E'){
     
                        char tmp='Z'-(5-(s[i]-'A'))+1;
                        res=res+tmp;
                    }else{
     
                        char tmp=s[i]-5;
                        res=res+tmp;
                    }
                }else{
     
                    res=res+s[i];
                }
            }
        }
        if(s=="END") cout<<res<<endl;
    }
    return 0;
}

D:最大连续子序列

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

思路:
最大连续子序列模板题。
可以参考:
https://blog.csdn.net/weixin_44123362/article/details/95936697
AC代码:

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

int n,a[MAX],s[MAX],dp[MAX];

int main(){
     
    while(scanf("%d",&n)!=EOF){
     
        memset(s,0,sizeof(s));
        memset(a,0,sizeof(a));
        memset(dp,0,sizeof(dp));
        bool flag=false;
        for(int i=0;i<n;i++){
     
            scanf("%d",&a[i]);
            if(a[i]>=0) flag=true;
        }
        if(flag==false){
     
            printf("0 0 0\n");
            continue;
        }
        dp[0]=a[0];
        for(int i=1;i<n;i++){
     
            if(dp[i-1]+a[i]>a[i]){
     
                dp[i]=dp[i-1]+a[i];
                s[i]=s[i-1];
            }else{
     
                dp[i]=a[i];
                s[i]=i;
            }
        }
        int k=0;
        for(int i=1;i<n;i++){
     
            if(dp[i]>dp[k]){
     
                k=i;
            }
        }
        printf("%d %d %d\n",dp[k],s[k],k);
    }
    return 0;
}

E:安全路径

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

思路:
由于n最大为1000,用floyd可能会超时,使用dijkstra即可。
注意把变成就好了。
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,vis[MAX];
double mp[MAX][MAX],dis[MAX];

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


int main(){
     
    while(scanf("%d",&n)!=EOF){
     
        memset(mp,0,sizeof(mp));
        double len;
        for(int i=1;i<=n;i++){
     
            for(int j=1;j<=n;j++){
     
                scanf("%lf",&len);
                mp[i][j]=len;
            }
        }
        scanf("%d",&m);
        int s,t;
        for(int i=0;i<m;i++){
     
            scanf("%d %d",&s,&t);
            dijkstra(s);
            if(dis[t]==0) printf("What a pity!\n");
            else printf("%.3f\n",dis[t]);
        }
    }
    return 0;
}

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