2013年中南大学研究生复试机试(1000~1004)

目录:

A:回文串问题
B:水仙花数
C:安全密码
D:最少钱币数
E:惠民工程

A:回文串问题

http://39.106.164.46/problem.php?id=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;

string s;

int main(){
     
    int cnt=1;
    while(cin>>s){
     
        int len=s.length();
        int i=0,j=len-1;
        bool flag=true;
        while(i<=j){
     
            if(s[i]!=s[j]){
     
                flag=false;
                break;
            }
            i++;
            j--;
        }
        if(flag) cout<<"case"<<cnt<<": yes"<<endl;
        else cout<<"case"<<cnt<<": no"<<endl;
        cnt++;
    }
    return 0;
}

B:水仙花数

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

思路:
找出m~n之间所有的水仙花数,从小到大输出,没有则输出no
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 m,n;

bool judge(int x){
     
    int a=x%10;
    int b=(x/10)%10;
    int c=(x/100)%10;
    int tmp=a*a*a+b*b*b+c*c*c;
    if(x==tmp) return true;
    return false;
}

int main(){
     
    while(cin>>m>>n){
     
        int cnt=0;
        vector<int> res;
        for(int i=m;i<=n;i++){
     
            if(judge(i)){
     
                res.push_back(i);
                cnt++;
            }
        }
        if(cnt==0) cout<<"no"<<endl;
        else{
     
            for(int i=0;i<res.size();i++){
     
                printf("%s%d",i==0?"":" ",res[i]);
            }
            cout<<endl;
        }
    }
    return 0;
}

C:安全密码

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

思路:
字符串问题。
AC代码:

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

string s;

int main(){
     
    while(cin>>s){
     
        int len=s.length();
        if(len<8){
     
            cout<<"NO"<<endl;
            continue;
        }
        bool f1=false,f2=false,f3=false,f4=false;
        int cnt=0;
        for(int i=0;i<len;i++){
     
            if(s[i]>='A'&&s[i]<='Z'){
     
                if(!f1){
     f1=true;cnt++;}
            }else if(s[i]>='a'&&s[i]<='z'){
     
                if(!f2){
     f2=true;cnt++;}
            }else if(s[i]>='0'&&s[i]<='9'){
     
                if(!f3){
     f3=true;cnt++;}
            }else{
     
                if(!f4){
     f4=true;cnt++;}
            }
        }
        if(cnt>=3) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}

D:最少钱币数

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

思路:
每次都先考虑拿最大的钱面来凑即可。
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,a[MAX];
int b[6]={
     100,50,10,5,2,1};

int main(){
     
    while(cin>>n){
     
        for(int i=0;i<n;i++){
     
            cin>>a[i];
        }
        int ans=0;
        for(int i=0;i<n;i++){
     
            int tot=a[i],now=0;
            while(now<tot){
     
                for(int j=0;j<6;j++){
     
                    int num=(tot-now)/b[j];
                    if(num!=0){
     
                        ans+=num;
                        now+=num*b[j];
                    }
                }
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

E:惠民工程

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

思路:
最小生成树的总权值。
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,m;
int mp[MAX][MAX],dis[MAX],vis[MAX];

int prim(){
     
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;i++){
     
        dis[i]=mp[1][i];
    }
    vis[1]=1;
    int ans=0;
    for(int i=0;i<n-1;i++){
     
        int u=-1,minl=INF;
        for(int j=1;j<=n;j++){
     
            if(vis[j]==0&&dis[j]<minl){
     
                minl=dis[j];
                u=j;
            }
        }
        if(u==-1) return -1;// 断掉了,不畅通
        vis[u]=1;
        ans+=dis[u];
        for(int v=1;v<=n;v++){
     
            if(vis[v]==0&&mp[u][v]<dis[v]){
     
                dis[v]=mp[u][v];
            }
        }
    }
    return ans;
}

int main(){
     
    while(cin>>n>>m){
     
        for(int i=1;i<=n;i++){
     
            for(int j=1;j<=n;j++){
     
                if(i==j){
     
                    mp[i][j]=0;
                }else{
     
                    mp[i][j]=INF;
                }
            }
        }
        int a,b,len;
        for(int i=0;i<m;i++){
     
            cin>>a>>b>>len;
            mp[a][b]=mp[b][a]=len;
        }
        int res=prim();
        if(res==-1) {
     cout<<"?"<<endl;continue;}
        else cout<<res<<endl;

        //疑问???
        /*int sum=0;
        for(int i=1;i<=n;i++){
            sum+=dis[i];
        }
        cout<
    }
    return 0;
}

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