17寒假训练热身赛1

问题 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个正整数N1<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个字符,分别用RSP来代表虫族,神族和人族。

输出

针对给出的每组测试数据,在屏幕上输出经过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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值