在 C 中解决代码力“1A Theatre Square”
Solving code-forces "1A Theatre Square" in C
这里的新手程序员试图在 C 方面做得更好,所以我开始在一个名为 codeforces 的网站上做代码问题。但是我似乎被卡住了,我编写的代码似乎在实践中有效,但网站不接受它是正确的。
问题:
首都贝尔兰的剧院广场呈n⟩×⟩米长方形。在城市周年之际,决定用方形花岗岩石板铺设广场。每块石板的大小为 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,但是网站不接受此代码是正确的,我可能是错的,但也许我使用的格式说明符不正确?
提前致谢。
典型的 double
(IEEE754 64 位浮点)没有足够的精度来解决这个问题。
例如,对于输入
999999999 999999999 1
你的程序可能会给出输出
999999998000000000
而实际答案是
999999998000000001
为避免这种情况,您不应使用浮点数据类型。
您可以添加 #include <inttypes.h>
并使用 64 位整数类型 int64_t
进行此计算。
"%" SCNd64
用于读取,"%" PRId64
用于写入 int64_t
。
cell(n/a)
整数可以通过 (n + a - 1) / a
.
完成
你可以用整数来解决这个问题。
#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;
}
首都贝尔兰的剧院广场呈n⟩×⟩米长方形。在城市周年之际,决定用方形花岗岩石板铺设广场。每块石板的大小为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
您可以尝试以下方法:
import math
x,y,z=list(map(float, input().split()))
print(math.ceil(x/z)*math.ceil(y/z))
使用下面的代码将通过我们需要的所有测试用例,所有变量声明都使用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;
}
这里的新手程序员试图在 C 方面做得更好,所以我开始在一个名为 codeforces 的网站上做代码问题。但是我似乎被卡住了,我编写的代码似乎在实践中有效,但网站不接受它是正确的。
问题:
首都贝尔兰的剧院广场呈n⟩×⟩米长方形。在城市周年之际,决定用方形花岗岩石板铺设广场。每块石板的大小为 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,但是网站不接受此代码是正确的,我可能是错的,但也许我使用的格式说明符不正确?
提前致谢。
典型的 double
(IEEE754 64 位浮点)没有足够的精度来解决这个问题。
例如,对于输入
999999999 999999999 1
你的程序可能会给出输出
999999998000000000
而实际答案是
999999998000000001
为避免这种情况,您不应使用浮点数据类型。
您可以添加 #include <inttypes.h>
并使用 64 位整数类型 int64_t
进行此计算。
"%" SCNd64
用于读取,"%" PRId64
用于写入 int64_t
。
cell(n/a)
整数可以通过 (n + a - 1) / a
.
你可以用整数来解决这个问题。
#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;
}
首都贝尔兰的剧院广场呈n⟩×⟩米长方形。在城市周年之际,决定用方形花岗岩石板铺设广场。每块石板的大小为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
您可以尝试以下方法:
import math
x,y,z=list(map(float, input().split()))
print(math.ceil(x/z)*math.ceil(y/z))
使用下面的代码将通过我们需要的所有测试用例,所有变量声明都使用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;
}