问题 A: 林教主的面试
时间限制: 1 Sec 内存限制: 64 MB提交: 427 解决: 94
[ 提交][ 状态][ 讨论版]
题目描述
林教一表人才, 才高八斗, 英明神武, 英俊潇洒, 玉树临风, 风流倜傥, 盖世无双, 人见人爱, 花见花开, 十全十美, 完美无缺, 空前绝后, 名垂青史. 万古流芳. 林教凭借他一日万行的编码速度,和5分钟内秒杀一切能做题目的惊人思维,还有对计算几何优化网络流等神级算法的深刻理解,获得所有集训队的一致认可, 在亚洲区域赛上更是摘金夺银, 独占鳌头.
已经进入大四的林教, 由于难遇敌手, 以致于心灰意冷, 无心恋战, 毅然选择了直接进入人生的下一阶段----工作.
林教首先来到了某国内知名公司(简称A公司). 由于A公司的所有员工都害怕林教进入A公司之后, 会掩盖了他们所有人的光芒, 但又不能明目张胆地去拒绝一个大大的人才, 于是都绞尽脑汁帮助面试官出各种世界性难题阻止林教拿到offer. As we all know, 林教的算法几乎是无敌的, 这些难题均被林教一一破解. 无奈之下, 面试官得知, 尽管林教懂二进制, 也懂小数, 但对二进制小数的理解颇为困惑(都怪当年逃课逃得太厉害了- -! ), 于是面试官眼前一亮, 临时出了一道具有一定误导性的题目: 请写出7.7(10)的二进制表示, 小数点后保留3位, 结果不需要四舍五入. 林教心想: 7(10)=111(2)这是无可辩驳的事实, 那7.7(10)就等于111.111(2). 于是, 他在面试官刚说完题目0.00000001秒便在纸上写上这个答案. 毫无悬念地, 林教就这样被无情地刷掉了!!! 林教在面试完回到寝室, 便发表状态: 在屌丝们的眼里, 7.7(10)也就只能等于111.111(2)了… 假如你是林教主, 你会给出什么样的答案呢?
输入
输入文件的第一行是一个正整数T, 代表测试数据的数量.
接下来T行, 每行为一个测试数据, 有两个数字, 第一个数字为一个十进制小数d, 为面试官出的题目里的数字, 0<=d<=10000, 且小数点后的数位都是4位; 第二个数字是一个非负整数k(1<=k<=100), 代表要给出的答案小数点后需要输出k位.
输出
对于输入文件里的每个测试数据, 输出相应的答案, 答案的格式为n(10)=m(2), 具体可参照样例输出.
样例输入
37.7000 30.5000 53.1416 2
样例输出
7.7000(10)=111.101(2)0.5000(10)=0.10000(2)3.1416(10)=11.00(2)
直接把小数点前后看作两个整数,因为小数点后只有四位,因此取整这里可以看作对10000取模
#include<iostream>
#include<cstdio>
#include<stack>
#include<algorithm>
using
namespace
std;
void
two(
int
a)
{
if
(a>1)
two(a/2);
printf
(
"%d"
,a&1);
}
int
main()
{
int
T;
scanf
(
"%d"
,&T);
while
(T--)
{
int
a,b,k;
scanf
(
"%d.%d%d"
,&a,&b,&k);
printf
(
"%d.%04d"
,a,b);
printf
(
"(10)="
);
two(a);
printf
(
"."
);
while
(k--)
{
b=b*2;
printf
(
"%d"
,b/10000);
b=b%10000;
}
printf
(
"(2)\n"
);
}
return
0;
}
问题 B: 使用栈实现进制转换
时间限制: 1 Sec 内存限制: 128 MB 提交: 52 解决: 28 [ 提交][ 状态][ 讨论版]题目描述
使用栈将一个很长(>30)的十进制数转换为二进制数
输入
若干个很长的十进制数
每行一个
输出
转换为二进制,每行输出一个
样例输入
123456789012345678901234567890 753951684269875454652589568545854758545824
样例输出
1100011101110100100001111111101101100001101110011111000001110111001001110001111110000101011010010 10001010011110101010001101001000100100100000101001011010001010101001000100111101011001110001000111110010001000101101111110110110100110100000
#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<stack>
#include<string>
using
namespace
std;
int
main()
{
char
t[5002];
int
a[5003];
while
(
scanf
(
"%s"
,&t)!=EOF)
{
int
L=
strlen
(t);
for
(
int
i=0;i<L;i++)
a[i]=t[i]-
'0'
;
stack<
int
>P;
while
(1)
{
for
(
int
i=0;i<L-1;i++)
{
a[i+1]+=a[i]%2*10;
a[i]=a[i]/2;
}
P.push(a[L-1]%2);
a[L-1]=a[L-1]/2;
bool
bb=0;
for
(
int
i=0;i<L;i++)
{
if
(a[i])
{
bb=1;
break
;
}
}
if
(!bb)
break
;//每一位都是0则跳出
}
while
(!P.empty())
{
printf
(
"%d"
,P.top());
P.pop();
}
printf
(
"\n"
);
}
return
0;
}
问题 C: 图形打印
时间限制: 1 Sec 内存限制: 128 MB 提交: 448 解决: 372 [ 提交][ 状态][ 讨论版]题目描述
根据要求,打印出树形图案。
输入
本题只有一组输入数据,为1个正整数N(1<N<10),N为奇数。
输出
请根据样例输出图形。 注:上半部分为底为N的等边三角形,下半部分为长度为(N-1)/2的直线。均以’*’号代替。每行行末无空格。
样例输入
7 5
样例输出
* *** ***** ******* * * * * *** ***** * *
#include<iostream>
#include<cstdio>
#include<stack>
#include<algorithm>
using
namespace
std;
int
main()
{
int
n;
while
(cin>>n)
{
for
(
int
i=1;i<=n/2+1;i++)
{
for
(
int
j=1;j<=n/2+1-i;j++)
cout<<
' '
;
for
(
int
j=1;j<=2*i-1;j++)
cout<<
'*'
;
cout<<endl;
}
for
(
int
i=1;i<=n/2;i++)
{
for
(
int
j=1;j<=n/2;j++)
cout<<
' '
;
cout<<
'*'
<<endl;
}
}
return
0;
}
问题 D: 七夕模拟赛
时间限制: 1 Sec 内存限制: 128 MB 提交: 49 解决: 19 [ 提交][ 状态][ 讨论版]题目描述
" 找啊找啊找GF,找到一个好GF,吃顿饭啊拉拉手,你是我的好GF.再见." " 诶,别再见啊..." 七夕...七夕...七夕这个日子,对于sqybi这种单身的菜鸟来说是多么的痛苦...虽然他听着这首叫做" 找啊找啊找GF" 的歌,他还是很痛苦.为了避免这种痛苦,sqybi决定要给自己找点事情干.他去找到了七夕模拟赛的负责人zmc MM,让她给自己一个出题的任务.经过几天的死缠烂打,zmc MM终于同意了. 但是,拿到这个任务的sqybi发现,原来出题比单身更让人感到无聊-_-....所以,他决定了,要在出题的同时去办另一件能够使自己不无聊的事情--给自己找GF. sqybi现在看中了n个MM,我们不妨把她们编号1到n.请MM吃饭是要花钱的,我们假设请i号MM吃饭要花rmb[i]块大洋.而希望骗MM当自己GF是要费人品的,我们假设请第i号MM吃饭试图让她当自己GF的行为(不妨称作泡该MM)要耗费rp[i]的人品.而对于每一个MM来说,sqybi都有一个对应的搞定她的时间,对于第i个MM来说叫做time[i]. sqybi保证自己有足够的魅力用time[i]的时间搞定第i个MM^_^. sqybi希望搞到尽量多的MM当自己的GF,这点是毋庸置疑的.但他不希望为此花费太多的时间(毕竟七夕赛的题目还没出),所以他希望在保证搞到MM数量最多的情况下花费的总时间最少. sqybi现在有m块大洋,他也通过一段时间的努力攒到了r的人品(这次为模拟赛出题也攒rp哦~~).他凭借这些大洋和人品可以泡到一些MM.他想知道,自己泡到最多的MM花费的最少时间是多少. 注意sqybi在一个时刻只能去泡一个MM--如果同时泡两个或以上的MM的话,她们会打起来的...
输入
输入的第一行是n,表示sqybi看中的MM数量.接下来有n行,依次表示编号为1, 2, 3, ..., n的一个MM的信息.每行表示一个MM的信息,有三个整数:rmb, rp和time.最后一行有两个整数,分别为m和r.
输出
你只需要输出一行,其中有一个整数,表示sqybi在保证MM数量的情况下花费的最少总时间是多少.
样例输入
4 1 2 5 2 1 6 2 2 2 2 2 3 5 5
样例输出
13
提示
数据规模对于20%数据,1< =n< =10; 对于100%数据,1< =rmb< =100,1< =rp< =100,1< =time< =1000; 对于100%数据,1< =m< =100,1< =r< =100,1< =n< =100. Hint sqybi说:如果题目里说的都是真的就好了... sqybi还说,如果他没有能力泡到任何一个MM,那么他就不消耗时间了(也就是消耗的时间为0),他要用这些时间出七夕比赛的题来攒rp... 出题人 sqybi GG
#include<iostream>
#include<cstdio>
#include<stack>
#include<string.h>
#include<string>
#include<algorithm>
int
d[4][2]={{0,1},{0,-1},{1,0},{-1,0}},dp[102][102][102],t[102][102][102];
using
namespace
std;
int
main()
{
int
n,mb[102],rp[102],
time
[102];
while
(cin>>n)
{
for
(
int
i=1;i<=n;i++)
cin>>mb[i]>>rp[i]>>
time
[i];
int
x,y;cin>>x>>y;
memset
(dp,0,
sizeof
(dp));
memset
(t,0,
sizeof
(t));
for
(
int
i=1;i<=n;i++)
{
for
(
int
j=1;j<=x;j++)
{
for
(
int
k=1;k<=y;k++)
{
if
(j>=mb[i]&&k>=rp[i])
{
if
(dp[i-1][j][k]<dp[i-1][j-mb[i]][k-rp[i]]+1)
{
dp[i][j][k]=dp[i-1][j-mb[i]][k-rp[i]]+1;
t[i][j][k]=t[i-1][j-mb[i]][k-rp[i]]+
time
[i];
}
else
if
(dp[i-1][j][k]==dp[i-1][j-mb[i]][k-rp[i]]+1)
{
int
t1,t2;
dp[i][j][k]=dp[i-1][j][k];
t1=t[i-1][j][k];
t2=t[i-1][j-mb[i]][k-rp[i]]+
time
[i];
t[i][j][k]=min(t1,t2);
}
else
{
dp[i][j][k]=dp[i-1][j][k];
t[i][j][k]=t[i-1][j][k];
}
}
else
{
dp[i][j][k]=dp[i-1][j][k];
t[i][j][k]=t[i-1][j][k];
}
}
}
}
cout<<t[n][x][y]<<endl;
}
return
0;
}
问题 E: 星际争霸
时间限制: 1 Sec 内存限制: 128 MB 提交: 82 解决: 48 [ 提交][ 状态][ 讨论版]题目描述
我们来玩一个有趣的游戏,在一个二维的网格内创建一个星际世界。在最开始,每一个网格都被神族、虫族、人族三种生命形态中的一种所占据。每一天的白天, 相邻网格的不同生命形态间会发生战争,在每一场战争中,虫族总是能打败神族,神族总是能打败人族,人族总是能打败虫族。在当天晚上,胜利的一方会将它的领土扩张,覆盖掉失败者的领土。
你的任务是计算出经过n天后,各生命形态所占据的新版图。
输入
第一行包含数字t,代表共有t组测试数据。
每一组测试数据的第一行包含三个不大于100的整数,网格的行数r,网格的列数c,以及n。接下去的r行每行包含了c个字符,分别用R、S、P来代表虫族,神族和人族。
输出
针对给出的每组测试数据,在屏幕上输出经过n天的战争后,各生命形态所占据的新版图。并在每组数据间留一空行。
样例输入
23 3 1RRRRSRRRR3 4 2RSPRSPRSPRSP样例输出
RRRRRRRRRRRRSRRSPRSPR
#include<iostream>
#include<cstdio>
#include<stack>
#include<string.h>
#include<string>
#include<algorithm>
int
d[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
using
namespace
std;
int
main()
{
char
t[102][102],f[102][102];
int
n,T;cin>>T;
while
(T--)
{
int
x,y;cin>>x>>y>>n;
for
(
int
i=0;i<x;i++)
for
(
int
j=0;j<y;j++)
cin>>t[i][j];
for
(
int
i=0;i<x;i++)
for
(
int
j=0;j<y;j++)
f[i][j]=t[i][j];
for
(
int
o=1;o<=n;o++)
{
for
(
int
i=0;i<x;i++)
for
(
int
j=0;j<y;j++)
t[i][j]=f[i][j];
for
(
int
i=0;i<x;i++)
{
for
(
int
j=0;j<y;j++)
{
for
(
int
k=0;k<4;k++)
{
int
x1=i+d[k][0],y1=j+d[k][1];
if
(x1>=0&&x1<x&&y1>=0&&y1<y)
{
if
(t[i][j]==
'R'
&&t[x1][y1]==
'S'
)
f[x1][y1]=
'R'
;
if
(t[i][j]==
'S'
&&t[x1][y1]==
'P'
)
f[x1][y1]=
'S'
;
if
(t[i][j]==
'P'
&&t[x1][y1]==
'R'
)
f[x1][y1]=
'P'
;
}
}
}
}
}
for
(
int
i=0;i<x;i++)
{
for
(
int
j=0;j<y;j++)
cout<<f[i][j];
cout<<endl;
}
cout<<endl;
}
return
0;
}
问题 F: 谁能受到女神的垂怜之第二轮
时间限制: 1 Sec 内存限制: 64 MB 提交: 832 解决: 267 [ 提交][ 状态][ 讨论版]题目描述
恭喜通过了第一轮的光棍们!不得不说,现在的光棍们运气都十分的好,因此,通过第一轮的人数还是太多了,无奈之下,女神绞尽脑汁想出了第二轮筛选方法,那就是,比谁的脑子反应快!规则是这样的,女神告诉光棍们一个时间,包括了小时,分钟和秒,然后再告诉一个x,要让大家抢答,问在女神给出的时间的基础下,在经过了x秒之后的时间是多少?(不会出现24:00:00这样的时间,23:59:59之后的经过一秒的时间应该是00:00:00);输入
输入包含T组数据,第一行首先输入一个T,表示有T组数据,之后有T行输入数据,每行含有四个正整数,分别表示小时,分钟,秒,X。(每个数<= 10^9)输出
对于每组输入数据,首先输出他是第几组输出数据,之后再输出在女神给出的时间下经过x秒之后的时间,输出格式详见样例输出。对于不满足24小时计时原理的输入,则直接输出“u at keng wo!!”(不包含双引号);样例输入
3 23 59 59 1 00 00 00 1 24 00 00 1
样例输出
Case 1: 00:00:00 Case 2: 00:00:01 Case 3: u at keng wo!!
#include<iostream>
#include<cstdio>
#include<stack>
#include<iomanip>
#include<algorithm>
using
namespace
std;
int
main()
{
int
case1=1,T;cin>>T;
while
(T--)
{
int
x,y,z,t;
cin>>x>>y>>z>>t;
cout<<
"Case "
<<case1++<<
':'
<<endl;
if
(!(x>=0&&x<=23&&y>=0&&y<=59&&z>=0&&z<=59))
{
cout<<
"u at keng wo!!"
<<endl;
continue
;
}
t=t%(60*60*60);
x=x+t/(60*60);
t=t-t/(60*60)*60*60;
y=y+t/60;
t=t-t/60*60;
z=z+t;
if
(z>=60)
{
y++;z=z-60;
}
if
(y>=60)
{
x++;y=y-60;
}
if
(x>=24)
x=x%24;
if
(x<10)
cout<<
'0'
<<x<<
':'
;
else
cout<<x<<
':'
;
if
(y<10)
cout<<
'0'
<<y<<
':'
;
else
cout<<y<<
':'
;
if
(z<10)
cout<<
'0'
<<z<<endl;
else
cout<<z<<endl;
}
return
0;
}