【题解 Part 2】NBUT 2012 Weekly - 27th Oct for 12x

[D] Easy One链接

        非常简单的一道题;考察二维数组的最基本运用。把输入的矩阵上下左右均颠倒,然后输出这个矩阵。

        1 2 3            9 8 7

        4 5 6    ->     6 5 4    

        7 8 9            3 2 1

        根本不需要在二维数组上动手脚,只要在写i、j的时候让它们倒着遍历即可;

输出的时候只要这样写:

for(int i = n - 1; i >=0; i --)

{

for(int j = m - 1 ; j >=0; j --)

{

balabala...

}

}

所以代码就是:

#include<iostream>
using namespace std;

char pic[505][505];

int main()
{
 int n,m,i,j;
 while(~scanf("%d%d",&n,&m))
 {
  getchar();
  for(i = 0 ; i < n; i ++)
  {
   for(j = 0 ; j < m; j ++)
    scanf("%c",&pic[i][j]);
   getchar();
  }

  for(i = n - 1; i >= 0 ; i --)
  {
   for(j = m - 1; j >= 0 ; j --)
    printf("%c",pic[i][j]);
   printf("\n");
  }
 }
 return 0;
}



[E] Get Lost链接

        题意就是,给你一个“迷宫”,迷宫上面的每一个点代表一个方向,走到了'E'这个点,那么你只能往矩阵的右边走,走到了‘N’这个点,代表接下来你只能往上走,等等。现在告诉你你的起始位置,那么就会有两种可能:
    ①:一直走,最后走出矩形;

                 NBUT 2012 Weekly - 27th Oct for 12x【题解 Part 2】 - Mr.Cai - --恢弘志士之气,不宜妄自菲薄
 
    ②:考虑如下矩形:
                NBUT 2012 Weekly - 27th Oct for 12x【题解 Part 2】 - Mr.Cai - --恢弘志士之气,不宜妄自菲薄
 
          从左上角进入以后的路线如图,
因此问题就是回答能不能走出去,即“yes”或”no“。
        这道题一个起点对应一个解,所以没有什么算法可言,就是模拟一下走路即可。设置两个数组,v[22][22]和t[22][22];
t[22][22]用于存放地图的信息,v[22][22]用于存放是否走过,就是说如果你当前在t[i][j]上,走一步以后,v[i][j] = 1;还是不太理解v数组的作用的话,你可以把这两个二维数组叠在一起,t上面放着v,立体一下,就好像v数组里面的值站立在t这个地图上一样。最后就是关键了,【i或者j小于0】 或者【i走出m列或者j走出n行】,意味着你走出去了,输出“yes”;如果你要走的下一个格子值是'1',代表什么意思知道了吧?就是你走到“曾经走过的”格子上了,这时候答案就是"no"了。

#include <cstdio>
#include <iostream>
using namespace std;

int m, n;
int v[22][22];
char t[22][22];

int mapwalk(int x, int y)
{
 while (1)
 {
  if (x < 0 || y < 0 || x == m || y == n) return 1;
  if (v[x][y]) return 0;
  v[x][y] = 1;
  if (t[x][y] == 'N') x--;
  else if (t[x][y] == 'S') x++;
  else if (t[x][y] == 'W') y--;
  else if (t[x][y] == 'E') y++;
 }
}

int main()
{
 //freopen("in.in", "r", stdin);
 //freopen("out.out", "w", stdout);
 while (~scanf("%d%d", &m, &n))
 {
  int x, y;
  scanf("%d%d", &x, &y);
  memset(v, 0, sizeof(v));
  for (int i = 0; i < m; i++)
   scanf("%s", t[i]);
  if (mapwalk(x, y)) printf("YES\n");
  else printf("NO\n");
 }

 return 0;
}



[F] Large Wave of Leadership链接


      这道题的意思是,有一个车队,前后衔接排成一排,每辆车的速度和车的长度各不相同,现在车队要通过一个地方,要求是车队不能断,就是说车与车之间不能分离,车队不能断,就是指所有的车同一个速度,那按照谁的速度呢?毫无疑问是按照最小速度,如此一来问题就变得相当简单了,输出最小速度*车队长度就是答案了。
#include<iostream>
using namespace std;

int main()
{
 //freopen("in.txt","r",stdin);
 //freopen("data2.txt","w",stdout);
 int tot,n,sum,speed;
 while(~scanf("%d",&tot))
 {
  int min  =9999999;
  sum = 0;
  for(int i  = 0 ; i < tot; i ++)
  {
   scanf("%d%d",&n,&speed);
   sum += n;
   if(min > speed) min = speed;
  }
  printf("%.2lf\n",sum*1.0/min);
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值