吉大考研机试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
#include
#include//调用库函数,读者可以自己写
using
namespace
std;
int
main()
{
string s;
while
(getline(cin,s)){
//注意空格
if
(s==
"!"
)
break
;
for
(
int
i=0;i
if
(
isupper
(s[i])){
//是大写字母
s[i]=
'A'
+
'Z'
-s[i];
}
if
(
islower
(s[i])){
//是小写字母
s[i]=
'a'
+
'z'
-s[i];
}
}
cout<
}
return
0;
}
题目二(jobdu1106:数字之和)、 http://ac.jobdu.com/problem.php?pid=1106
对于给定的正整数 n,计算其十进制形式下所有位置数字之和,并计算其平方的各位数字之和。
题目分析:把整数转化成字符串,逐个累加每一位数字,注意字符转化为整数只需要减去‘0’,即减去‘0’的ASCII值
AC代码:
#include
#include
#include
#include
using
namespace
std;
int
CountSum(
char
*s){
int
sum=0,len=
strlen
(s);
for
(
int
i=0;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\n"
,CountSum(s0),CountSum(s1));
//cout<
}
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
#include
#include
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
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<
}
return
0;
}
题目四(jobdu1108:堆栈的使用)、 http://ac.jobdu.com/problem.php?pid=1108
根据给定的字符,模拟栈的操作。每行的第一个字符可能是'P’或者'O’或者'A’;如果是'P’,后面还会跟着一个整数,表示把这个数据压入堆栈;如果是'O’,表示将栈顶的值 pop 出来,如果堆栈中没有元素时,忽略本次操作;如果是'A’,表示询问当前栈顶的值,如果当时栈为空,则输出'E'。堆栈开始为空。
题目分析:只需要把各个字符与栈的操作相对应即可。
AC代码:
#include
#include
using
namespace
std;
int
main()
{
int
n;
while
(cin>>n&&n){
char
c;
int
a;
stack<
int
> sta;
for
(
int
i=0;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<
}
else
cout<<
"E"
<
break
;
default
:
break
;
}
}
cout<
}
return
0;
}
题目五(jobdu1109:连通图)、
给定一个无向图和其中的所有边,判断这个图是否所有顶点都是连通的。
题目分析:简单的dfs()+标记搜索
AC代码:
/**
*深度优先遍历+访问标记
*/
#include
#include
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
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"
<
else
cout<<
"NO"
<
}
return
0;
}
你可能感兴趣的:(九度OJ~考研机试,小喵算法经,九度OJ~考研机试,九度,吉大考研,机试题)