2011年吉林大学计算机研究生机试真题
2016-04-12 11:38
225 查看
题目1105:字符串的反码
题目描述:一个二进制数,将其每一位取反,称之为这个数的反码。下面我们定义一个字符的反码。如果这是一个小写字符,则它和字符'a’的距离与它的反码和字符'z’的距离相同;如果是一个大写字符,则它和字符'A’的距离与它的反码和字符'Z’的距离相同;如果不是上面两种情况,它的反码就是它自身。
举几个例子,'a’的反码是'z’;'c’的反码是'x’;'W’的反码是'D’;'1’的反码还是'1’;'$'的反码还是'$'。
一个字符串的反码定义为其所有字符的反码。我们的任务就是计算出给定字符串的反码。
输入:
输入每行都是一个字符串,字符串长度不超过 80 个字符。如果输入只有!,表示输入结束,不需要处理。
输出:
对于输入的每个字符串,输出其反码,每个数据占一行。
样例输入:
Hello JLU-CCST-2011 !
样例输出:
Svool QOF-XXHG-2011
#include<iostream> #include<cstdio> #include<stdlib.h> #include<string.h> using namespace std; char s[30]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'}; char q[30]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; int main() { char str[100]; while(gets(str),strcmp(str,"!"))//逗号表达式的结果就是最后一个表达式的结果。 { for(int i=0;i<strlen(str);i++) { if(str[i]<='Z'&&str[i]>='A') str[i]=s[25+'A'-str[i]]; else if(str[i]<='z'&&str[i]>='a') str[i]=q[25+'a'-str[i]]; } cout<<str<<endl; } return 0; }
题目1106:数字之和
题目描述:对于给定的正整数 n,计算其十进制形式下所有位置数字之和,并计算其平方的各位数字之和。
输入:
每行输入数据包括一个正整数n(0<n<40000),如果n=0 表示输入结束,并不用计算。
输出:
对于每个输入数据,计算其各位数字之和,以及其平方值的数字之和,输出在一行中,之间用一个空格分隔,但行末不要有空格。
样例输入:
4 12 97 39999 0
样例输出:
4 7 3 9 16 22 39 36
#include<iostream> #include<cstdio> #include<string.h> using namespace std; int main() { char str[100],str1[100]; long long sum,ans; int result; long long res; while(cin>>str&&strcmp(str,"0")) { sum=0; ans=0; for(int i=0;i<strlen(str);i++) sum+=str[i]-'0'; sscanf(str,"%d",&result);//将字符串转换成整数 res=result*result; sprintf(str1,"%d",res);//将整数转换成字符串 for(int i=0;i<strlen(str1);i++) ans+=str1[i]-'0'; cout<<sum<<" "<<ans<<endl; } return 0; }
题目1107:搬水果
题目描述:在一个果园里,小明已经将所有的水果打了下来,并按水果的不同种类分成了若干堆,小明决定把所有的水果合成一堆。每一次合并,小明可以把两堆水果合并到一起,消耗的体力等于两堆水果的重量之和。当然经过 n‐1 次合并之后,就变成一堆了。小明在合并水果时总共消耗的体力等于每次合并所耗体力之和。
假定每个水果重量都为 1,并且已知水果的种类数和每种水果的数目,你的任务是设计出合并的次序方案,使小明耗费的体力最少,并输出这个最小的体力耗费值。例如有 3 种水果,数目依次为 1,2,9。可以先将 1,2 堆合并,新堆数目为3,耗费体力为 3。然后将新堆与原先的第三堆合并得到新的堆,耗费体力为 12。所以小明总共耗费体力=3+12=15,可以证明 15 为最小的体力耗费值。
输入:
每组数据输入包括两行,第一行是一个整数 n(1<=n<=10000),表示水果的种类数,如果 n 等于 0 表示输入结束,且不用处理。第二行包含 n 个整数,用空格分隔,第 i 个整数(1<=ai<=1000)是第 i 种水果的数目。
输出:
对于每组输入,输出一个整数并换行,这个值也就是最小的体力耗费值。输入数据保证这个值小于 2^31。
样例输入:
3 9 1 2 0
样例输出:
15
方法一:常规方法,但是超时
#include<iostream> #include<algorithm> #include<string.h> using namespace std; int a[10008]; void sorts(int l,int r) { for(int i=l;i<r-1;i++) { for(int j=l+1;j<r;j++) { if(a[i]>a[j]) { int tem; tem=a[i]; a[i]=a[j]; a[j]=tem; } } } } int main() { int n,b,sum; while(cin>>n&&n) { memset(a,0,sizeof(a)); for(int i=0;i<n;i++) cin>>a[i]; b=0; sum=0; while(b!=n-1) { sorts(b,n); a[b+1]=a+a[b+1]; sum+=a[b+1]; b++; } cout<<sum<<endl; } return 0; }
方法二:STL,优先权队列求解哈弗曼树
/* 这道题目一开始我用排序来做,每次选择最小的两个,相当于构建了霍夫曼树,最后统计所有非叶子结点之和。但是因为每次排序的基数太大,所以会一直超时。 所以我们用优先队列模拟一个堆,利用最小堆的特征来快速得到最小的两个数。STL带有优先队列-priority_queue。 priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数: priority_queue<Type, Container, Functional> 其中Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。 Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list. STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话, 优先队列就是大顶堆,队头元素最大。 如果要用到小顶堆,则一般要把模板的三个参数都带进去。 */ #include <iostream> #include <queue> using namespace std; int main(){ int n=0,temp=0,sum=0; while(cin >> n && n != 0){ priority_queue<int, vector<int>, greater<int> > mp; for(int i=0;i<n;i++){ cin >> temp; mp.push(temp); } while(mp.size() > 1){ int a = mp.top(); mp.pop(); int b = mp.top(); mp.pop(); sum += (a+b); mp.push(a+b); } cout << sum << endl; sum = 0; } return 0; }
题目1108:堆栈的使用
[b]题目描述:堆栈是一种基本的数据结构。堆栈具有两种基本操作方式,push 和 pop。Push一个值会将其压入栈顶,而 pop 则会将栈顶的值弹出。现在我们就来验证一下堆栈的使用。
输入:
对于每组测试数据,第一行是一个正整数 n,0<n<=10000(n=0 结束)。而后的 n 行,每行的第一个字符可能是'P’或者'O’或者'A’;如果是'P’,后面还会跟着一个整数,表示把这个数据压入堆栈;如果是'O’,表示将栈顶的值 pop 出来,如果堆栈中没有元素时,忽略本次操作;如果是'A’,表示询问当前栈顶的值,如果当时栈为空,则输出'E'。堆栈开始为空。
输出:
对于每组测试数据,根据其中的命令字符来处理堆栈;并对所有的'A’操作,输出当时栈顶的值,每个占据一行,如果当时栈为空,则输出'E’。当每组测试数据完成后,输出一个空行。
样例输入:
3 A P 5 A 4 P 3 P 6 O A 0
样例输出:
E 5 3
#include<iostream> #include<string.h> using namespace std; int a[10008],top; int main() { int n,t; char c; while(cin>>n&&n) { memset(a,0,sizeof(a)); top=-1; while(n--) { cin>>c; if(c=='P') { cin>>t; a[++top]=t; } else if(c=='O') { if(top!=-1) top--; } else if(c=='A') { if(top==-1) cout<<"E"<<endl; else cout<<a[top]<<endl; } } cout<<endl; } return 0; }
题目1109:连通图
题目描述:给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的。
输入:
每组数据的第一行是两个整数 n 和 m(0<=n<=1000)。n 表示图的顶点数目,m 表示图中边的数目。如果 n 为 0 表示输入结束。随后有 m 行数据,每行有两个值 x 和 y(0<x, y <=n),表示顶点 x 和 y 相连,顶点的编号从 1 开始计算。输入不保证这些边是否重复。
输出:
对于每组输入数据,如果所有顶点都是连通的,输出"YES",否则输出"NO"。
样例输入:
4 3 1 2 2 3 3 2 3 2 1 2 2 3 0 0
样例输出:
NO YES
算法分析:并查集的应用
#include<iostream> #include<cstdio> #include<string.h> using namespace std; int pre[1050]; int t[1050]; //t 用于标记独立块的根结点 int find(int x)//找到x的上级 { int r=x; while(pre[r]!=r)//如果r的上级不是r,即r不是根节点 r=pre[r];//r是根节点 /////////////路径压缩,将所有下属的上级都设置为根节点 int i=x,j; while(pre[i]!=r) { j=pre[i];//记录i的上级 pre[i]=r;//将r的上级设置为根节点 i=j;//对上级继续处理 } ///////////////////////// return r;//返回根节点 } void join(int x,int y)//判断x和y的上级是否相同,不同则合并为同一个上级 { int fx=find(x); int fy=find(y); if(fx!=fy)//上级不一样 { pre[fy]=fx;//将fx设置为fy的上级,使得二者上级一样 } } int main() { int n,m,a,b,ans; freopen("datain.txt","r",stdin); freopen("dataout.txt","w",stdout); while(cin>>n>>m&&n) { ans=0; memset(t,0,sizeof(t)); for(int i=1;i<=n;i++) pre[i]=i; while(m--) { cin>>a>>b; join(a,b); } for(int i=1;i<=n;i++) { t[find(i)]=1;//将独立的根节点设置为1,有几个1就是有几个独立的根节点 } for(int i=1;i<=n;i++) { if(t[i]==1) ans++; } if(ans==1) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
相关文章推荐
- Linux网络配置和MySQL、Apache、PHP环境的搭建
- 网络编程--ASI--(ASIHTTPRequest)介绍
- netstat命令输出结果分析
- 网络备忘之参考资料
- 理解 Linux 网络栈(1):Linux 网络协议栈简单总结
- 网络备忘之参考资料
- 从网络获取json后实现新闻列表界面
- 计算机图形学(一) 视频显示设备_6_三维观察设备
- 链表的创建以及链表节点的增加和删除
- [深入浅出Cocoa]iOS网络编程之CFNetwork
- Android断网后让用户进入到系统设置界面设置网络
- 计算机组成原理硬盘篇 —— 机械硬盘(HDD)与固态硬盘(SSD)
- Nginx HTTP User_agent
- 高性能的OkHttp
- 5_5 集合栈计算机(UVa12096)<stack与STL其他容器的综合运用>
- 网络安全(1)
- HashMap实现原理分析
- 构建svn+apache并实现https
- 关于okhttp
- bzoj 3504(神题,网络流)