2013年中南大学复试机试

2013年中南大学复试机试

第一题:回文串问题

题目描述:

“回文串”是一个正读和反读都一样的字符串,字符串由数字和小写字母组成,比如“level”或者“abcdcba”等等就是回文串。请写一个程序判断读入的字符串是否是“回文”。
输入包含多个测试实例,每一行对应一个字符串,串长最多100字母。
对每个字符串,输出它是第几个,如第一个输出为"case1: “;如果一个字符串是回文串,则输出"yes”,否则输出"no",在yes/no之前用一个空格。

输入输出格式:

输入:
level
abcde
noon
haha
输出
case1: yes
case2: no
case3: yes
case4: no

#include<iostream>
#include<string>
#include<string.h>
using namespace std; 
char data[1000];
int main(){
    
    
    string str;
    int index=0;
    while(cin>>str){
    
    
        index++;
        bool flag=true;
        int i=0,k=0;
        int len=str.length();
        for(i=0;i<len/2;i++){
    
    
            data[i]=str.at(i);
        }
        k=i-1;
        if(len%2!=0){
    
    
            i++;
        }
        for(;i<len;i++){
    
    
            if(str.at(i)!=data[k]){
    
    
                flag=false;
                break;
            }
            k--;
        }
        if(flag==false){
    
    
            cout<<"case"<<index<<": no"<<endl;
        }
        else{
    
    
            cout<<"case"<<index<<": yes"<<endl;
        }
    }
    return 0;
}

第二题:水仙花数

题目描述:

春天是鲜花灿烂的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=13+53+3^3。现在要求输出所有在m和n范围内的水仙花数。
输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)。
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开(注意每组输出的最后一个数之后不要加空格);如果给定的范围内不存在水仙花数,则输出no;每个测试实例的输出占一行。

输入输出格式:

输入
100 120
300 380
输出
no
370 371

题解
#include<iostream>
 
using namespace std;
 
int main(){
    
    
    int low, high;
    while (cin >> low >> high){
    
    
        int count = 0;
        int d = 0;
        for (d = low; d <= high; d++){
    
    
            int a = d / 100;
            int b = (d - a * 100) / 10;
            int c = (d - a * 100 - b * 10);
            if (d == a*a*a + b*b*b + c*c*c){
    
    
                if (count == 0){
    
    
                    cout << d;
                }
                else{
    
    
                    cout << " " << d;
                }
                count++;
            }
        }
        if (count == 0){
    
    
            cout << "no";
        }
        cout<< endl;
    }
    return 0;
}

第三题:安全密码

题目描述:

网络上各类交易活动越来越普及,为了能够安安心心地上网,经常需要设置一个安全的密码。一般来说一个比较安全的密码至少应该满足下面两个条件:
(1)密码长度大于等于8。
(2)密码中的字符应该来自下面“字符类别”中四组中的至少三组。
这四个字符类别分别为:
(1)大写字母:A,B,C…Z;
(2)小写字母:a,b,c…z;
(3)数字:0,1,2…9;
(4)特殊符号:~,!,@,#,$,%,^;
给你一个密码,你的任务就是判断它是不是一个安全的密码。
输入数据有多组,每组占一行,每行一个密码(长度最大可能为50),密码仅包括上面的四类字符。
对于每个测试实例,判断这个密码是不是一个安全的密码,是的话输出YES,否则输出NO。

输入输出格式:

输入
a1b2c3d4
Linle@ACM
~@^@!%
输出
NO
YES
NO

题解
#include<bits/stdc++.h>
using namespace std;
int main(){
    
    
    string s;
    while (cin>>s)
    {
    
    
        int a[4]={
    
    0,0,0,0},cnt=0;
        for(int i=0;i<s.length();i++){
    
    
            if(s[i]>='A'&&s[i]<='Z') a[0]++;
            else if(s[i]>='a'&&s[i]<='z') a[1]++;
            else if(s[i]>='0'&&s[i]<='9') a[2]++;
            else a[3]++;
        }
        for(int i=0;i<4;i++)
            if(a[i]!=0) cnt++;
        if(cnt>=3&&s.length()>=8)
            printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

第四题:最少钱币数

题目描述:

作为A公司的职员,最盼望的日子就是每月的8号了,因为这一天是发工资的日子,养家糊口就靠它了。但是对于公司财务处的工作人员来说,这一天则是很忙碌的一天,财务处的小胡最近就在考虑一个问题:如果每个员工的工资额都知道,最少需要准备多少张人民币,才能在给每位职员发工资的时候都不用老师找零呢?这里假设员工的工资都是正整数,单位元,人民币一共有100元、50元、10元、5元、2元和1元六种。
输入数据包含多个测试实例,每个测试实例的第一行是一个整数n(n<=100),表示老师的人数,然后是n个老师的工资(工资<5000)。
每个测试用例输出一行,即凑成钱数值M最少需要的钱币个数。如果凑钱失败,输出“Impossible”。你可以假设,每种待凑钱币的数量是无限多的。

输入输出格式:

输入
3
1 2 3
2
1 2
输出
4
2

题解
#include<bits/stdc++.h>
using namespace std;
int main(){
    
    
    int n,a;
    while (scanf("%d",&n)!=EOF)
    {
    
    
        int ans = 0;
        for(int i=0;i<n;i++){
    
    
            scanf("%d",&a);
            ans+=a/100;
            ans+=(a%100)/50;
            ans+=(a%50)/10;
            ans+=(a%10)/5;
            ans+=(a%5)/2;
            ans+=a%100%50%10%5%2;
        }
        printf("%d\n",ans);
    }
    return 0;
}

第五题:惠民工程

题目描述:

市政府“惠民工程”的目标是在全市n个居民点间之架设煤气管道(但不一定有直接的管道相连,只要能间接通过管道可达即可)。很显然最多可架设 n(n-1)/2条管道,然而实际上要连通n个居民点只需架设n-1条管道就可以了。现请你编写程序,计算出该惠民工程需要的最低成本。
测试输入包含若干测试用例。每个测试用例的第1行给出居民点数目M ( < =100 )、 评估的管道条数 N;随后的 N 行对应居民点间管道的成本,每行给出一对正整数,分别是两个居民点的编号,以及此两居民点间管道的成本(也是正整数)。为简单起见,居民点从1到M编号。
对每个测试用例,在1行里输出全市管道畅通所需要的最低成本。若统计数据不足以保证畅通,则输出“?”。

输入输出格式:

输入
3 3
1 2 1
1 3 2
2 3 4
3 1
2 3 2
输出
3
?

题解
#include<bits/stdc++.h>
using namespace std;
int n,m;
int arr[105];
struct node{
    
    
    int start,end,w;
}a[5010];
int compare(node x,node y){
    
    
    return x.w<y.w;
}
int find(int x){
    
    
    while(arr[x]!=x){
    
    
        x=arr[x];
    }
    return x;
}
int add(int x,int y){
    
    
    int x1=find(x);
    int y1=find(y);
    if(x1!=y1){
    
    
        arr[x1]=y1;
        return 1;
    }
    return 0;
}
int main(){
    
    
    while(scanf("%d%d",&m,&n)!=EOF){
    
    
        for(int i=0;i<n;i++){
    
    
            scanf("%d%d%d",&a[i].start,&a[i].end,&a[i].w);
        }
        sort(a,a+n,compare);
        for(int i=1;i<=m;i++){
    
    
            arr[i]=i;
        }
        int num=0;
        int result=0;
        for(int i=0;num<m-1&&i<n;i++){
    
    
            if(add(a[i].start,a[i].end)){
    
    
                num++;
                result+=a[i].w;
            }
        }
            if(num==m-1){
    
    
                printf("%d\n",result);}
            else{
    
    
                printf("?\n");
            }
        
    }
    return 0;
}

欢乐的时光总是短暂的,让我们下一次再见!!!

good good study,day day up! (study hard, improve every day)

预知后事,请听下回分解!!!!

猜你喜欢

转载自blog.csdn.net/qq_41606378/article/details/113666549