zoukankan      html  css  js  c++  java
  • 九度oj题目&吉大考研11年机试题全解

                                                          九度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(int i=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;
        }
        return 0;
    }

    题目二(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){
        int sum=0,len=strlen(s);
        for(int i=0;i<len;i++){
            sum+=(s[i]-'0');
        }
        return sum;
    }
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF&&n){
            char s0[20],s1[20];
            sprintf(s0,"%d",n);//itoa(n,s0,10);写入字符串
            sprintf(s1,"%d",n*n);
            printf("%d %d ",CountSum(s0),CountSum(s1));
            //cout<<CountSum(s0)<<" "<<CountSum(s0)<<endl;
        }
        return 0;
    }
     
    题目三(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()
    {
        //数据越小优先级越高,当中第二个參数为容器类型,第二个參数为比較函数。
        int n;
        while(cin>>n&&n){
            priority_queue<int, vector<int>, greater<int> > q;
            int a,b;
            for(int i=0;i<n;i++){
                cin>>a;
                q.push(a);
            }
            int s=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;
        }
        return 0;
    }

    题目四(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()
    {
        int n;
        while(cin>>n&&n){
            char c; int a;
            stack<int> sta;
            for(int i=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;
                        }
                        else cout<<"E"<<endl;
                    break;
                    default: break;
                }
            }
            cout<<endl;
        }
        return 0;
    }
     
    题目五(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(int j=1;j<=n;j++){//模拟推断全部边点
            if(a[i][j]==1&&vis[j]==0)//能联通,且未訪问
                dfs(j);
        }
    }
    int main()
    {
        int b,c;
        while(cin>>n>>m&&n){
            memset(a,0,sizeof(a));
            memset(vis,0,sizeof(vis));
            for(int i=0;i<m;i++){
                cin>>b>>c;
                a[b][c]=a[c][b]=1;//无向图
            }
            dfs(1);//从第一个节点開始,原则上能够从随意结点開始
            int ok=1;
            for(int i=1;i<=n;i++){
                if(vis[i]==0){//不联通
                    ok=0; break;
                }
            }
            if(ok) cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
     
        }
        return 0;
    }
     

  • 相关阅读:
    20155335 俞昆 第十周作业
    课下加分项目 MYPWD 20155335 俞昆
    20155335 俞昆 实时系统 实验三
    20155335俞昆 2017-2018-1 《信息安全系统设计》第9周学习总结
    2017-2018-1 20155335 俞昆 《信息安全系统设计基础》第7周学习总结
    实验二 20155335 实验报告 固件程序设计
    2017-2018-1 20155319 《信息安全系统设计基础》第八周学习总结
    信息安全技术 实验三 数字证书应用
    第二次实验
    2017-2018-1 20155319 《信息安全系统设计基础》第七周学习总结
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4344295.html
Copyright © 2011-2022 走看看