九度oj题目&吉大考研11年机试题全解

来源:互联网 发布:淘宝怎么举报卖家店铺 编辑:程序博客网 时间:2024/05/11 05:00

                                                      九度oj题目(吉大考研11年机试题全解)

吉大考研机试2011年题目:

题目一(jobdu1105:字符串的反码)、    http://ac.jobdu.com/problem.php?pid=1105

       一个二进制数,将其每一位取反,称之为这个数的反码。下面我们定义一个字符的反码。如果这是一个小写字符,则它和字符'a’的距离与它的反码和字符'z’的距离相同;如果是一个大写字符,则它和字符'A’的距离与它的反码和字符'Z’的距离相同;如果不是上面两种情况,它的反码就是它自身。

例如:'a’的反码是'z’;'c’的反码是'x’;'W’的反码是'D’;'1’的反码还是'1’;'$'的反码还是'$'。一个字符串的反码定义为其所有字符的反码。我们的任务就是计算出给定字符串的反码。输入!结束。


题目分析:此题目是字符串模拟问题,至需要根据题意模拟即可,对于大小写判断即可

if(大写字符)  s[i] = 'A' + 'Z' - s[i];         if(小写字符)  s[i] = 'a' + 'z' - s[i];


AC代码:


#include<iostream>
#include<string>
#include<cctype>//调用库函数,读者可以自己写
using namespace std;
int main()
{
    string s;
    while(getline(cin,s)){//注意空格
        if(s=="!")break;
        for(inti=0;i<s.length();i++){
            if(isupper(s[i])){//是大写字母
                s[i]='A'+'Z'-s[i];
            }
            if(islower(s[i])){//是小写字母
                s[i]='a'+'z'-s[i];
            }
        }
        cout<<s<<endl;
    }
    return0;
}

题目二(jobdu1106:数字之和)
、   http://ac.jobdu.com/problem.php?pid=1106
      对于给定的正整数 n,计算其十进制形式下所有位置数字之和,并计算其平方的各位数字之和。

题目分析:把整数转化成字符串,逐个累加每一位数字,注意字符转化为整数只需要减去‘0’,即减去‘0’的ASCII值

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
int CountSum(char *s){
    intsum=0,len=strlen(s);
    for(inti=0;i<len;i++){
        sum+=(s[i]-'0');
    }
    returnsum;
}
int main()
{
    intn;
    while(scanf("%d",&n)!=EOF&&n){
        chars0[20],s1[20];
        sprintf(s0,"%d",n);//itoa(n,s0,10);写入字符串
        sprintf(s1,"%d",n*n);
        printf("%d %d\n",CountSum(s0),CountSum(s1));
        //cout<<CountSum(s0)<<" "<<CountSum(s0)<<endl;
    }
    return0;
}
 
题目三(jobdu1107:搬水果)、    http://ac.jobdu.com/problem.php?pid=1107
      小明可以把两堆水果合并到一起,消耗的体力等于两堆水果的重量之和。当然经过 n‐1 次合并之后,就变成一堆了。小明在合并水果时总共消耗的体力等于每次合并所耗体力之和。你的任务是设计出合并的次序方案,使小明耗费的体力最少,并输出这个最小的体力耗费值。例如有 3 种水果,数目依次为 1,2,9。可以先将 1,2 堆合并,新堆数目为3,耗费体力为 3。然后将新堆与原先的第三堆合并得到新的堆,耗费体力为 12。所以小明总共耗费体力=3+12=15,可以证明 15 为最小的体力耗费值。

题目分析:
此题在考优先队列,不过也不用自己写,STL里面有优先队列priority_queue

AC代码:


/**
 *优先队列问题
 */
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
int main()
{
    //数据越小优先级越高,其中第二个参数为容器类型,第二个参数为比较函数。
    intn;
    while(cin>>n&&n){
        priority_queue<int, vector<int>, greater<int> > q;
        inta,b;
        for(inti=0;i<n;i++){
            cin>>a;
            q.push(a);
        }
        ints=0;
        while(q.size()>1){
            a=q.top(); q.pop();
            b=q.top(); q.pop();
            s+=a+b;
            q.push(a+b);
        }
        cout<<s<<endl;
    }
    return0;
}

题目四(jobdu1108:堆栈的使用)、    http://ac.jobdu.com/problem.php?pid=1108
      根据给定的字符,模拟栈的操作。每行的第一个字符可能是'P’或者'O’或者'A’;如果是'P’,后面还会跟着一个整数,表示把这个数据压入堆栈;如果是'O’,表示将栈顶的值 pop 出来,如果堆栈中没有元素时,忽略本次操作;如果是'A’,表示询问当前栈顶的值,如果当时栈为空,则输出'E'。堆栈开始为空。

题目分析:只需要把各个字符与栈的操作相对应即可。

AC代码:

#include<iostream>
#include<stack>
using namespace std;
int main()
{
    intn;
    while(cin>>n&&n){
        charc; int a;
        stack<int> sta;
        for(inti=0;i<n;i++){
            cin>>c;
            switch(c){
                case'P':
                    cin>>a;
                    sta.push(a);
                break;
                case'O':
                    if(!sta.empty()){//非空输出
                        sta.pop();
                    }
                break;
                case'A':
                    if(!sta.empty()){//非空输出
                        cout<<sta.top()<<endl;
                    }
                    elsecout<<"E"<<endl;
                break;
                default:break;
            }
        }
        cout<<endl;
    }
    return0;
}
 
题目五(jobdu1109:连通图)、   
      给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的。

题目分析:简单的dfs()+标记搜索

AC代码:


/**
 *深度优先遍历+访问标记
 */
#include<iostream>
#include<cstring>
using namespace std;
int m,n,a[1001][1001];//记录边,a[i][j]=1;表示联通
int vis[1001];//记录定点是否被访问
int dfs(int i){
    vis[i]=1;//先做标记,已访问
    for(intj=1;j<=n;j++){//模拟判断所有边点
        if(a[i][j]==1&&vis[j]==0)//能联通,且未访问
            dfs(j);
    }
}
int main()
{
    intb,c;
    while(cin>>n>>m&&n){
        memset(a,0,sizeof(a));
        memset(vis,0,sizeof(vis));
        for(inti=0;i<m;i++){
            cin>>b>>c;
            a[b][c]=a[c][b]=1;//无向图
        }
        dfs(1);//从第一个节点开始,原则上可以从任意结点开始
        intok=1;
        for(inti=1;i<=n;i++){
            if(vis[i]==0){//不联通
                ok=0;break;
            }
        }
        if(ok) cout<<"YES"<<endl;
        elsecout<<"NO"<<endl;
 
    }
    return0;
}
 

1 0
原创粉丝点击