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

来源:互联网 发布:美图秀秀 for mac 编辑:程序博客网 时间:2024/06/14 09:06

[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;}

0 0
原创粉丝点击