MC0109 新河妇荡杯
题目
今有妇人河上荡杯,津吏问曰:杯何以多? 妇人曰:家有客。 津吏曰:客几何? 妇人曰:二人共饭,三人共羹,四人共肉,凡用杯六十五,不知客几何?” ——《孙子算经》
新时代,小码哥凭借自己的努力,在村里盖了一栋漂亮的双层小洋楼。为了庆祝这乔迁新居之喜,以及感谢村民们一路来的帮扶,小码哥亲自下厨,大摆筵席。
小码哥主打三道硬菜:红烧老鹅、糖醋排骨以及松子桂鱼。忙了一上午的小码哥自豪的说道:”我恰好为每a个人准备了一盘红烧老鹅,为每b个人准备了一道糖醋排骨,为每c个人准备了一道松子桂鱼。我一个上午一共做了s道菜呢!”
聪明的你能编程来推测出小码哥一共宴请了多少人吗?
格式
输入格式:
读入数据共一行,四个用空格分隔的整数:a,b,c,s,含义如题意中所示。
输出格式:
输出一个整数,表示小码哥一共宴请的人数,保证答案小于10^6。
算法思想:
这种方法可以通过枚举的方式逐个尝试可能的解,直到找到符合条件的解为止。虽然这种方法在解空间很大的情况下可能不太高效,但对于本题给定的范围来说,可以找到正确的答案。
代码:
#include<stdio.h>
int main()
{
int a,b,c,s,t;
scanf("%d %d %d %d",&a,&b,&c,&s);
for(int i=0;i<1000000;i++){
if(i/a+i/b+i/c==s&&i%a==0&&i%b==0&&i%c==0){
printf("%d",i);
}
}
return 0;
}
MC0110 曼哈顿距离矩阵
题目
在一个平面上,两个点的曼哈顿距离是指这两个点横纵坐标差的绝对值之和,也就是说
ManhattanDist((x1,y1),(x2,y2))=∣x1−x2∣+∣y1−y2∣
小码哥在学习完曼哈顿距离之后,构造出了一个曼哈顿距离矩阵。在这个矩阵上,每个位置按照到 (0,0)(0,0) 的曼哈顿距离的从小到大依次编号,对于距离相同的位置,按照顺时针编号。这样小码哥就得到了如同下图的矩阵:
在这里 (0,0)位置的方格填了数字 0, 然后 (1,0),(0,−1),(−1,0),(0,1)的位置依次填 1,2,3,4然后以此类推。
现在小码哥给你了一个位置 (x,y),希望你计算一下 (x,y)这个位置填放的数字是多少。
格式
输入格式:
输入仅包含两个数字 x,y(∣x∣,∣y∣≤10^3),表示小码哥询问的位置。
输出格式:
输出在指定位置填放的具体数字。
算法思想:
下面这段代码的逻辑是基于对填放数字的规律进行计算,然后根据给定的位置 (x, y) 来计算填放的数字。这段代码虽然比较复杂,但通过计算曼哈顿距离和位置所在象限,可以准确地计算出填放的数字。
代码: C语言
#include<stdio.h>
int main()
{
int a,x,y;
scanf("%d %d",&x,&y);
int b=fabs(x)+fabs(y);
if(x==0&&y==0){
a=0;
}else{
a=1;
for(int i=1;i<b;i++){
a+=4*i;
}
//printf("%d",a);
if(x>0&&y>=0){
a+=(x-1);
}else if(x>=0&&y<0){
a+=b;
a+=fabs((x-b));
a-=1;
}else if(x<0&&y<=0){
a+=(2*b);
a+=fabs(x);
a-=1;
}else if(x<=0&&y>0){
a+=(3*b);
a+=fabs((x+b));
a-=1;
}
}
printf("%d",a);
return 0;
}
代码通过