MC0107 污渍
难度: 白银 时间限制:1秒 占用内存:128M
小码哥有一张无限大的方格纸,每个格点都有坐标 (i,j)(i,j),其中 i、j 为整数。
粗心的小码哥不慎将两滴墨水滴在了方格纸上,每滴墨水会对一个正方形区域产生污染。(一个正方形区域包含若干个完整的格子,一个格子是一个由四个相邻格点围起来面积为1的单位区域。)
小码哥想请你算算一共会有多少个格子被污染。
注意:”数学上把在平面直角坐标系中横纵坐标均为整数的点称为格点(lattice point)或整点。”
——摘自百度百科
输入格式:
输入共一行 6 个整数,用空格分隔,表示两块正方形污渍左上角格点的坐标分别为 (a,b)、(c,d) ,边长分别为 v1和 v2 个单位长度。
输出格式:
输出一行一个整数,表示一共有多少个格子会被污染。
备注
注意,这里所有整数的范围应该使用32位整数存储(如在c/c++下应使用int)。
算法思想:
可以通过计算两个正方形的交集区域的格子数量来解决。然后将两个正方形的格子数量相加,再减去交集区域的格子数量,就可以得到被污染的总格子数。下面算法实现了计算两个正方形交集区域的格子数量,并最终计算出被污染的格子总数。使用了 max 和 min 函数来获取两个数的最大和最小值。
算法(C语言):
#include<stdio.h>
int max(int a, int b)
{
return (a > b) ? a : b;
}
int min(int a, int b)
{
return(a < b) ? a : b;
}
int main()
{
int a,b,v1,c,d,v2,e;
scanf("%d %d %d %d %d %d",&a,&b,&v1,&c,&d,&v2);
e=v1*v1;
int a1 = max(a,c);
int b1 = min(b,d);
int c1 = min(a+v1,c+v2);
int d1 = max(b-v1, d-v2);
if ( a1 > c1 || b1 < d1){
e += v2*v2;
}else{
e += v2*v2;
e -= (c1 - a1) * (b1 -d1);
}
printf("%d",e);
return 0;
}
MC0108白给
小码哥和小码妹在玩一个游戏,初始小码哥拥有 x的金钱,小码妹拥有 y的金钱。
虽然他们不在同一个队伍中,但他们仍然可以通过游戏的货币系统进行交易,通过互相帮助以达到共赢的目的。具体来说,在每一回合,他们首先会查看谁的金钱比较多,然后金钱较多的一方会赠送自己一半的金钱(下取整)给另一方。如果两人的金钱数量相同,那么总是由小码哥送钱给小码妹。
具体来说,如果当前回合两人各有 x,y的金钱,那么他们下一回合的金钱数量分别为:
现在他们想知道,经过 n 个回合之后,他们的金钱数量各为多少。
输入格式:
第一行包含两个整数 x和y,表示小码哥和小码妹的初始金钱。
第二行包含一个整数 n (1≤n≤10^3),表示回合数量。
输出格式:
输出两个整数 x’和 y’,表示经过 n个回合后他们各自的金钱数量。
算法思想:
设计一个循环,当进入循环后,直到小码哥和小码妹的金钱数量相等,每轮循环中,判断谁的金钱更多。如果小码哥的金钱数量大于小码妹的金钱数量,小码哥将赠送一半的金钱给小码妹,即将小码哥的金钱数量减去一半(下取整),小码妹的金钱数量增加相同的数量。如果小码哥的金钱数量小于等于小码妹的金钱数量,小码妹将赠送一半的金钱给小码哥,操作同上。下面这段代码将模拟这个游戏规则并计算出每个回合后小码哥和小码妹的金钱数量。虽然这种方法可以得到正确的结果,但当金钱数量很大时可能需要进行大量的计算,效率较低。
代码:
#include<stdio.h>
int main()
{
unsigned int x,y;
int n;
unsigned int a,b;
scanf("%d %d",&x,&y);
scanf("%d",&n);
for(int i=0;i<n;i++){
if(x>=y){
y+=x/2;
x-=x/2;
}else{
x+=y/2;
y-=y/2;
}
}
printf("%d %d",x,y);
return 0;
}