Codeforce Flea CodeForces - 32C 规律|思维

18 篇文章 0 订阅

题意

给我们一个n*m的表格 告诉我们每次跳跃的格子数量s
只能垂直或者水平跳跃 可以跳跃无限次 那么某格子能到达的不同格子的数量就是这个格子的值 求表格中值最大的格子的数量

分析

表面上看像是搜索 然而1e6的数据搜索行不通
其实分析下是个规律题 也就是符合能够互相抵达的格子最多的在一个表格中是符合某种计算规律的 我们发现 任意一个表格 都可以根据不同的跳跃数量得到规律从而计算出如果在表格中尽可能放更多的石子 石子时间横竖相差s步 然后发现这样的一种放置其实就是符合条件的一种解 也就是可以互相抵达 不同长宽的表格 或许会有很多个不同的最大放置数量 所以最后再算一下倍数 然后乘上最大放置数量就可以得到解

code

import java.util.Arrays;
import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        int n,m,s;
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        s = sc.nextInt();

        long ans = 0;
        long l,w; 
        // 计数
        if(s>=Math.max(n, m))System.out.println(1l*n*m);
        else{
            l = (n%s!=0?n/s+1:n/s);
            w = (m%s!=0?m/s+1:m/s);
            // 倍数
            long lt = 0,wt=0;
            if(n%s==0)lt+=s-1;
            else lt+=n-(n/s)*s-1;
            if(m%s==0)wt+=s-1;
            else wt+=m-(m/s)*s-1;
            long time = lt*wt==0?lt+wt+1:(lt+1)*(wt+1);// 如果横向可以平移最大放置策略 纵向也可以平移 那么最后的倍数是横向倍数*纵向倍数 
            ans = 1l*l*w*time;
            System.out.println(ans);     
        }
    }

}

最大放置多少个以及倍数之间的计算关系写错了好几次。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值