zoukankan      html  css  js  c++  java
  • 51nod 1293:球与切换器

    题目来源: Codility
    基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
     收藏
     取消关注
    有N行M列的正方形盒子。每个盒子有三种状态0, -1, +1。球从盒子上边或左边进入盒子,从下边或右边离开盒子。规则:
    如果盒子的模式是-1,则进入它的球从下面出去。(方向变为向下)
    如果盒子的模式是+1,则进入它的球从右面出去。 (反向变为向右)
    如果盒子的模式是0, 则进入它的球方向不变。从上面进入的,从下面出去,从左面进入的,从右面出去。


    球离开一个盒子,这个盒子的模式切换为相反数。已知,每个盒子的状态,扔k个球,它们都从左上角那个盒子的上面进入(方向向下),问最终有几个球从右下角的盒子的下边出去。
    (可以理解维球一个一个放,等待的时间足够长,不会有两个球同时进入一个盒子的情形)本题由Javaman翻译。
    Input
    第1行:包括3个数M, N, K中间用空格分隔,M,N 为盒子的宽度和高度,K为球的数量(1 <= M, N <= 1000, 1 <= K <= 10^18)。
    第2 - N + 1行:每行M个数(-1, 0 或 1),表示对应的模式。
    Output
    输出1个数,对应最终有有多少个球从右下角的盒子的下边出去。
    Input示例
    3 2 4
    -1 0 -1
    1 0 0
    Output示例
    1

    经过该切换器的球的总量是k,发现如果是该位置的值是1,那么会有(k+1)/2的球像右去,剩下的球向下去。如果该位置的值是-1,那么会有(k+1)/2的球像下去,剩下的球向右去。

    最后求右下角的位置球向下的数量。

    代码:

    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <vector>
    #include <string>
    #include <cstring>
    #pragma warning(disable:4996)
    using namespace std;
    
    int m, n;
    long long k;
    int num[1005][1005];
    long long val[1005][1005][2];//val[x][y][0]表示位置x,y去往下面的球的数量。val[x][y][1]表示位置x,y去往右面的球的数量
    
    int main()
    {
    	//freopen("i.txt", "r", stdin);
    	//freopen("o.txt", "w", stdout);
    
    	int i, j;
    	long long temp;
    	scanf("%d%d%lld", &m, &n, &k);
    	memset(val, 0, sizeof(val));
    
    	for (i = 1; i <= n; i++)
    	{
    		for (j = 1; j <= m; j++)
    		{
    			scanf("%d", &num[i][j]);
    			if (i != 1 || j != 1)
    			{
    				temp = val[i - 1][j][0] + val[i][j - 1][1];
    
    				if (num[i][j] == 0)
    				{
    					val[i][j][0] = val[i - 1][j][0];
    					val[i][j][1] = val[i][j - 1][1];
    				}
    				else if (num[i][j] == 1)
    				{
    					val[i][j][1] = (temp + 1) / 2;
    					val[i][j][0] = temp / 2;
    				}
    				else
    				{
    					val[i][j][0] = (temp + 1) / 2;
    					val[i][j][1] = temp / 2;
    				}
    			}
    			else
    			{
    
    				if (num[1][1] == 0)
    				{
    					val[1][1][0] = k;
    					val[1][1][1] = 0;
    				}
    				else if (num[1][1] == 1)
    				{
    					val[1][1][1] = (k + 1) / 2;
    					val[1][1][0] = k / 2;
    				}
    				else
    				{
    					val[1][1][0] = (k + 1) / 2;
    					val[1][1][1] = k / 2;
    				}
    			}
    		}
    	}
    	printf("%lld
    ", val[n][m][0]);
    	return 0;
    }


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    Yii2的深入学习--行为Behavior
    使用WordPress搭建自己的博客
    php-resque的设计和使用
    PHP的学习--在Atom中使用XDebug(Mac)
    七牛镜像的使用
    macOS平台下虚拟摄像头的研发总结
    macOS下利用dSYM文件将crash文件中的内存地址转换为可读符号
    XCode日常使用备忘录
    DirectShow Filter的开发实践
    Windows下程序启动时出现0xc000007b错误的解决方案
  • 原文地址:https://www.cnblogs.com/lightspeedsmallson/p/4899523.html
Copyright © 2011-2022 走看看