华农Acm Scau 9521
题目
#9521 射了多少 II
该题有题解
时间限制:1000MS 内存限制:65535K
提交次数:81 通过次数:25
题型: 编程题 语言: G++;GCC
Description
大家都知道CS中的AWP可以一枪KO人家,最爽的就是没看到别人,但知道人家在墙后而一枪穿墙爆头击毙.
现在把CS地图定义为一个三维空间,你的位置在(x0,y0,z0),你不知道敌人的位置(除非有间谍),因此你想尽可能多的穿过地图上的格子.
但你不知道如何计算当他射向点(x1,y1,z1)(到x1,y1,z1停下来)的时候穿过了多少个格子,因此希望你这个强大的programmer帮忙
输入格式
输入中一共有两行
第一行是3个整数表示你的位置x0,y0,z0(1000>=x0,y0,z0>=0)
第二行是3个整数表示子弹停下的位置x1,y1,z1(1000>=x1,y1,z1>=0)
输出格式
输出只有一行
穿过的格子数(碰到不算穿过任何格子,要严格穿过)
输入样例
0 0 0
2 2 2
输出样例
2
来源 ick2
作者 a470086609
题解
寻找规律,利用上一题目的规律会发现其实是稍微容斥一下下就好了
Code
#ifdef local
#include <ctime>
#endif
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>
#define rep(i,e) for(int i=0;i<e;i++)
#define rep1(i,e) for(int i=1;i<=e;i++)
#define repx(i,x,e) for(int i=x;i<=e;i++)
#define ll long long
#define pii pair<int,int>
#define F first
#define S second
#define pb push_back
#define mp make_pair
#define mset(var,val) memset(var,val,sizeof(var))
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define scd(a) scanf("%d",&a)
#define scdd(a,b) scanf("%d%d",&a,&b)
#define scddd(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define test(a) cout<<a<<endl
#define test2(a,b) cout<<a<<" "<<b<<endl
#define test3(a,b,c) cout<<a<<" "<<b<<" "<<c<<endl
typedef unsigned long long ull;
using namespace std;
const int inf = 0x3f3f3f3f;
const int N = 1e6 + 10;
int x0;
int x1;
int y1;
int y0;
int z0;
int z1;
int gcd(int a, int b) {
if(a == 0 || b ==0)return 0;
if (a < b) { //保证a大于等于b,便于a%b的运算
int temp;
temp = a;
a = b;
b = temp;
}
while (a % b) { //如果余数不为0,就一直进行辗转相除
int r = a % b; //r为a和b的余数,即r = a mod(b);
a = b;
b = r;
r = a % b;
}
return b;
}
void work() {
cin >> x0 >> y0 >> z0 >> x1 >> y1 >> z1;
int dx = abs(x0 - x1);
int dy = abs(y0 - y1);
int dz = abs(z0 - z1);
int ans= dx+dy+dz-(gcd(dx,dy)+gcd(dx,dz)+gcd(dy,dz))+(gcd(gcd(dx,dy),dz));
cout<<ans<<endl;
}
int main() {
int debug = 0;
#ifdef local
debug = 1;
#endif
if (debug) {
freopen("in.txt", "r", stdin);
freopen("out", "w", stdout);
printf("debuging output:\n");
}
work();
}