用C C+求解“1A剧院广场”

cx6n0qe3  于 2023-01-12  发布在  其他
关注(0)|答案(6)|浏览(171)

新手程序员在这里试图得到更好的c,所以我开始做代码的问题,在一个网站称为codeforce。然而,我似乎卡住了,我写的代码,似乎在实践中工作,但网站不接受它的权利。
问题是:
柏林首都的剧院广场是一个长方形的广场,大小为n × m米。在城市的周年纪念之际,决定用方形花岗岩石板铺广场。每块石板的大小为a × a。铺广场所需的石板的最少数量是多少?允许覆盖比剧院广场大的表面。但广场必须有遮盖物,不允许打碎石板,石板的侧面应与广场的侧面平行。1
资料来源:
https://codeforces.com/problemset/problem/1/A
我确实很难完全理解这个问题背后的数学原理,所以我使用了一个名为"Joshua Pan"的用户提供的答案来更好地理解这个问题
资料来源:
https://www.quora.com/How-do-I-solve-the-problem-Theatre-Square-on-Codeforces
这是我的代码:

#include<stdio.h>
#include<math.h>

int main(void)
{
    double n,m,a;
    scanf("%lf %lf %lf", &n,&m,&a);
    printf("%1.lf\n", ceil(n/a)*ceil(m/a));

    return 0;
}

我用"gcc TheatreSquare.c-lm"编译的
当给定示例输入6,6,4时,我的代码生成正确的输出4,但是网站不接受此代码为正确的,我可能是错误的,但也许我使用的格式说明符不正确?
先谢了。

92dk7w1h

92dk7w1h1#

典型的double(IEEE754 64位浮点)没有足够的精度来解决这个问题。
例如,对于输入

999999999 999999999 1

您的程序可能会给予输出

999999998000000000

实际上答案是

999999998000000001

为了避免这种情况,您不应该使用浮点数据类型。
您可以添加#include <inttypes.h>并使用64位整数类型int64_t进行此计算。
"%" SCNd64用于阅读,而"%" PRId64用于写入。
整数上的cell(n/a)可以通过(n + a - 1) / a来完成。

kg7wmglp

kg7wmglp2#

你可以用整数来解决这个问题。

#include <stdio.h>

int main()
{
    unsigned long n, m, a = 1;
    unsigned long na, ma, res = 0;
    
    scanf("%lu %lu %lu", &n, &m, &a);
    
    na = n/a;

    if (n%a != 0)
        na++;
    
    ma = m/a;

    if (m%a != 0)
        ma++;

    res = na * ma;

    printf("%lu", res);

    return 0;
}

这段代码在Codeforce平台的测试9中会失败(见下文),但是如果您编译它并使用相同的输入在本地运行它,结果是正确的。

> Test: #9, time: 15 ms., memory: 3608 KB, exit code: 0, checker exit code: 1, verdict: WRONG_ANSWER
> Input 1000000000 1000000000 1
> Output 2808348672 Answer 1000000000000000000
> Checker Log wrong answer 1st numbers differ - expected: '1000000000000000000', found: '2808348672'

编辑:

上面描述的问题是由于我运行的是64位机器,而在线编译器可能使用的是32位,unsigned long变量溢出。
以下代码将通过所有测试。

#include <stdio.h>

int main()
{
    unsigned long long n, m, a = 1;
    unsigned long long na, ma, res = 0;
    
    scanf("%llu %llu %llu", &n, &m, &a);
    
    na = n/a;

    if (n%a != 0)
        na++;
    
    ma = m/a;

    if (m%a != 0)
        ma++;

    res = na * ma;

    printf("%llu", res);

    return 0;
}
wooyq4lh

wooyq4lh3#

使用下面的代码,它将通过所有的测试用例,我们需要使用long long声明所有变量以获得输出。

#include <stdio.h>
#include <math.h>
int main(){
    long long n,m,a,l,b;
    scanf("%lld%lld%lld",&n,&m,&a);
    l= n/a;
    if(n%a != 0)
    l++;
    b= m/a;
    if(m%a != 0)
    b++;
    printf("%lld",l*b);
    return 0;
}
dgtucam1

dgtucam14#

柏林首都的剧院广场是一个长方形,大小为n × m米。在城市的周年纪念日之际,决定在广场上铺上正方形的花岗岩石板,每块石板的大小为a × a。

import java.util.Scanner;

public class theatre_square {

    public static void main(String[] args) {
        long a,b,c;
        Scanner s = new Scanner(System.in);
        a = s.nextLong();
        b = s.nextLong();
        c = s.nextLong();
        long result = 0;
        if(a>=c){
            if(a%c==0) 
            result = a/c;
            else
            result = a/c + 1; // some part is left
        }else{ // area of rectangle < area of square then 1 square is required
            result = 1;
        }
        if(b>=c){
            if(b%c==0)
            result *= b/c;
            else
            result *= b/c + 1;
        }
        System.out.println(result);

    }
}



 case 1 .  2 2 3 => 1
          length = 2 so 2 < 3 then only 1 square required <br>
          breadth = 2 so 2 < 3 then covered in previous square so output 1
          
              intial view 
               
              0 0
              0 0

             after adding 1 square ( r= remaining or left)
      
              1 1 r
              1 1 r
              r r r

case 2 .  6 6 4  => 4
          length = 2 so 6 > 4 then only 2 square required <br>
          breadth = 2 so 6 > 4 then 2 square required 
          
              intial view 
               
              0 0 0 0 0 0
              0 0 0 0 0 0
              0 0 0 0 0 0
              0 0 0 0 0 0
              0 0 0 0 0 0
              0 0 0 0 0 0

             after adding 4 square ( r= remaining or left)
      
              1 1 1 1 2 2 r r
              1 1 1 1 2 2 r r
              1 1 1 1 2 2 r r
              1 1 1 1 2 2 r r
              3 3 3 3 4 4 r r
              3 3 3 3 4 4 r r
              r r r r r r r r
              r r r r r r r r
uoifb46i

uoifb46i5#

您可以尝试以下操作:

import math

x,y,z=list(map(float, input().split()))  
print(math.ceil(x/z)*math.ceil(y/z))
bcs8qyzn

bcs8qyzn6#

下面是CPP中解决上述问题的代码。我们需要一个long long变量来存储值,因为我们可能有一个非常大的值。

问题指南:

当我们得到边的提示时,我们必须很好地覆盖它们。对于一个矩形,我们知道我们有一个长度和高度,表示为n * m,而正方形是a*a,所以我们将尝试首先覆盖长度,并首先确定它的正方形,我们将它除以k,然后如果存在任何余数,我们将再加一,高度也是如此。
"我希望它能帮到你"

这就是密码

#include<iostream>
using namespace std;
int main()
{
   long long n,m,k,l=0,o=0;
   cin>>n>>m>>k;
   
   l=n/k;
   if(n%k!=0)
   {
          l++;
   }
   
   o=m/k;
   
   if(m%k!=0)
   { 
         o++;
   }
   
   cout<<l*o;

}

相关问题